package jar import ( "crypto/rand" "encoding/hex" "errors" "io" "net/http" "os" "strings" "flink-kube-operator/pkg" api "github.com/logi-camp/go-flink-client" "go.uber.org/zap" ) type JarFile struct { uri string filePath string } func NewJarFile(URI string) (*JarFile, error) { jarFile := &JarFile{ uri: URI, } err := jarFile.Download() if err != nil { return nil, err } return jarFile, nil } func (jarFile *JarFile) Upload(flinkClient *api.Client) (fileName string, err error) { resp, err := flinkClient.UploadJar(jarFile.filePath) if err != nil { pkg.Logger.Error("[main] error uploading jar", zap.Error(err)) } filePathParts := strings.Split(resp.FileName, "/") fileName = filePathParts[len(filePathParts)-1] if resp.Status != "success" { err = errors.New("jar upload was not success") } jarFile.delete() return } func (jarFile *JarFile) Download() error { randBytes := make([]byte, 16) rand.Read(randBytes) fileName := hex.EncodeToString(randBytes) jarFile.filePath = "/tmp/" + fileName + ".jar" out, err := os.Create(jarFile.filePath) if err != nil { return err } defer out.Close() resp, err := http.Get(jarFile.uri) if err != nil || resp.StatusCode > 299 { jarFile.delete() return err } defer resp.Body.Close() _, err = io.Copy(out, resp.Body) if err != nil { return err } return nil } func (jarFile *JarFile) delete() error { pkg.Logger.Info("[jar] [delete]", zap.String("path", jarFile.filePath)) err := os.Remove(jarFile.filePath) if err != nil { pkg.Logger.Error("[jar] [delete]", zap.Error(err)) } return err }