in pulsaradmin/pkg/admin/packages.go [130:197]
func (p packages) Upload(packageURL, filePath, description, contact string, properties map[string]string) error {
if strings.TrimSpace(filePath) == "" {
return errors.New("file path is empty")
}
if strings.TrimSpace(packageURL) == "" {
return errors.New("package URL is empty")
}
packageName, err := utils.GetPackageName(packageURL)
if err != nil {
return err
}
endpoint := p.pulsar.endpoint(p.basePath, string(packageName.GetType()), packageName.GetTenant(),
packageName.GetNamespace(), packageName.GetName(), packageName.GetVersion())
metadata := utils.PackageMetadata{
Description: description,
Contact: contact,
Properties: properties,
}
// buffer to store our request as bytes
bodyBuf := bytes.NewBufferString("")
multiPartWriter := multipart.NewWriter(bodyBuf)
metadataJSON, err := json.Marshal(metadata)
if err != nil {
return err
}
stringWriter, err := p.createStringFromField(multiPartWriter, "metadata")
if err != nil {
return err
}
_, err = stringWriter.Write(metadataJSON)
if err != nil {
return err
}
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
part, err := multiPartWriter.CreateFormFile("file", filepath.Base(file.Name()))
if err != nil {
return err
}
// copy the actual file content to the filed's writer
_, err = io.Copy(part, file)
if err != nil {
return err
}
if err = multiPartWriter.Close(); err != nil {
return err
}
contentType := multiPartWriter.FormDataContentType()
err = p.pulsar.Client.PostWithMultiPart(endpoint, nil, bodyBuf, contentType)
if err != nil {
return err
}
return nil
}