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
}