in pulsaradmin/pkg/admin/functions.go [163:220]
func (f *functions) CreateFunc(funcConf *utils.FunctionConfig, fileName string) error {
endpoint := f.pulsar.endpoint(f.basePath, funcConf.Tenant, funcConf.Namespace, funcConf.Name)
// buffer to store our request as bytes
bodyBuf := bytes.NewBufferString("")
multiPartWriter := multipart.NewWriter(bodyBuf)
jsonData, err := json.Marshal(funcConf)
if err != nil {
return err
}
stringWriter, err := f.createStringFromField(multiPartWriter, "functionConfig")
if err != nil {
return err
}
_, err = stringWriter.Write(jsonData)
if err != nil {
return err
}
if fileName != "" && !strings.HasPrefix(fileName, "builtin://") {
// If the function code is built in, we don't need to submit here
file, err := os.Open(fileName)
if err != nil {
return err
}
defer file.Close()
part, err := multiPartWriter.CreateFormFile("data", 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
}
}
// In here, we completed adding the file and the fields, let's close the multipart writer
// So it writes the ending boundary
if err = multiPartWriter.Close(); err != nil {
return err
}
contentType := multiPartWriter.FormDataContentType()
err = f.pulsar.Client.PostWithMultiPart(endpoint, nil, bodyBuf, contentType)
if err != nil {
return err
}
return nil
}