in src/app/backend/resource/deployment/deploy.go [304:368]
func DeployAppFromFile(cfg *rest.Config, spec *AppDeploymentFromFileSpec) (bool, error) {
reader := strings.NewReader(spec.Content)
log.Printf("Namespace for deploy from file: %s\n", spec.Namespace)
d := yaml.NewYAMLOrJSONDecoder(reader, 4096)
for {
data := &unstructured.Unstructured{}
if err := d.Decode(data); err != nil {
if err == io.EOF {
return true, nil
}
return false, err
}
version := data.GetAPIVersion()
kind := data.GetKind()
gv, err := schema.ParseGroupVersion(version)
if err != nil {
gv = schema.GroupVersion{Version: version}
}
discoveryClient, err := discovery.NewDiscoveryClientForConfig(cfg)
if err != nil {
return false, err
}
apiResourceList, err := discoveryClient.ServerResourcesForGroupVersion(version)
if err != nil {
return false, err
}
apiResources := apiResourceList.APIResources
var resource *metaV1.APIResource
for _, apiResource := range apiResources {
if apiResource.Kind == kind && !strings.Contains(apiResource.Name, "/") {
resource = &apiResource
break
}
}
if resource == nil {
return false, fmt.Errorf("unknown resource kind: %s", kind)
}
dynamicClient, err := dynamic.NewForConfig(cfg)
if err != nil {
return false, err
}
groupVersionResource := schema.GroupVersionResource{Group: gv.Group, Version: gv.Version, Resource: resource.Name}
namespace := spec.Namespace
if strings.Compare(spec.Namespace, "_all") == 0 {
namespace = data.GetNamespace()
}
if resource.Namespaced {
_, err = dynamicClient.Resource(groupVersionResource).Namespace(namespace).Create(context.TODO(), data, metaV1.CreateOptions{})
} else {
_, err = dynamicClient.Resource(groupVersionResource).Create(context.TODO(), data, metaV1.CreateOptions{})
}
if err != nil {
return false, errors.LocalizeError(err)
}
}
}