func CreateApplicationObject()

in gke-deploy/core/resource/application.go [17:83]


func CreateApplicationObject(name, selectorKey, selectorValue, descriptorType, descriptorVersion string, componentObjs Objects) (*Object, error) {
	componentKindsRemoveDups := make(map[metav1.GroupKind]bool)
	for _, obj := range componentObjs {
		kind := ObjectKind(obj)
		if kind == "Namespace" || kind == "Application" {
			continue
		}
		apiVersion := obj.GetAPIVersion() // e.g., v1, apps/v1, autoscaling/v2
		apiVersionSplit := strings.Split(apiVersion, "/")
		var group string
		if len(apiVersionSplit) == 1 {
			group = "core"
		} else {
			group = apiVersionSplit[0]
		}
		componentKindsRemoveDups[metav1.GroupKind{
			Group: group,
			Kind:  kind,
		}] = true
	}
	componentKinds := make([]metav1.GroupKind, 0, len(componentKindsRemoveDups))
	for k := range componentKindsRemoveDups {
		componentKinds = append(componentKinds, k)
	}
	// Sort to make spec.componentKinds deterministic
	sort.SliceStable(componentKinds, func(i, j int) bool {
		a := componentKinds[i]
		b := componentKinds[j]
		if a.Group == b.Group {
			return a.Kind < b.Kind
		}
		return a.Group < b.Group
	})

	app := &applicationsv1beta1.Application{
		TypeMeta: metav1.TypeMeta{
			Kind:       "Application",
			APIVersion: "app.k8s.io/v1beta1",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name: name,
		},
		Spec: applicationsv1beta1.ApplicationSpec{
			ComponentGroupKinds: componentKinds,
			Descriptor: applicationsv1beta1.Descriptor{
				Type:    descriptorType,
				Version: descriptorVersion,
			},
			Selector: &metav1.LabelSelector{
				MatchLabels: map[string]string{
					selectorKey: selectorValue,
				},
			},
		},
	}

	asMap, err := convertApplicationToMap(app)
	if err != nil {
		return nil, err
	}

	return &Object{
		&unstructured.Unstructured{
			Object: asMap,
		},
	}, nil
}