Skip to content

Commit

Permalink
refactor: use generic optimization code
Browse files Browse the repository at this point in the history
  • Loading branch information
elliotxx committed Aug 15, 2023
1 parent 8e06f7f commit 8d76703
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func (acg *Generator) GenerateSpec(
}

gfs := []generators.NewGeneratorFunc{}
generators.ForeachOrderedApps(acg.Apps, func(appName string, app appmodel.AppConfiguration) error {
generators.ForeachOrdered(acg.Apps, func(appName string, app appmodel.AppConfiguration) error {
gfs = append(gfs, generators.NewAppConfigurationGeneratorFunc(project.Name, appName, &app))
return nil
})
Expand Down
106 changes: 41 additions & 65 deletions pkg/generator/appconfiguration/generators/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,9 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"kusionstack.io/kusion/pkg/generator"
"kusionstack.io/kusion/pkg/models"
"kusionstack.io/kusion/pkg/models/appconfiguration"
"kusionstack.io/kusion/pkg/models/appconfiguration/workload/container"
)

// kubernetesResourceID returns the unique ID of a Kubernetes resource
// based on its type and metadata.
func kubernetesResourceID(typeMeta metav1.TypeMeta, objectMeta metav1.ObjectMeta) string {
// resource id example: apps/v1:Deployment:code-city:code-citydev
id := typeMeta.APIVersion + ":" + typeMeta.Kind + ":"
if objectMeta.Namespace != "" {
id += objectMeta.Namespace + ":"
}
id += objectMeta.Name
return id
}

// CallGeneratorFuncs calls each NewGeneratorFunc in the given slice
// and returns a slice of Generator instances.
func CallGeneratorFuncs(newGenerators ...NewGeneratorFunc) ([]Generator, error) {
Expand Down Expand Up @@ -53,6 +40,46 @@ func CallGenerators(spec *models.Spec, newGenerators ...NewGeneratorFunc) error
return nil
}

// ForeachOrdered executes the given function on each
// item in the map in order of their keys.
func ForeachOrdered[T any](
m map[string]T,
f func(key string, value T) error,
) error {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}

sort.Strings(keys)

for _, k := range keys {
v := m[k]
if err := f(k, v); err != nil {
return err
}
}

return nil
}

// IntPtr returns a pointer to the provided value.
func IntPtr[T any](i T) *T {
return &i
}

// kubernetesResourceID returns the unique ID of a Kubernetes resource
// based on its type and metadata.
func kubernetesResourceID(typeMeta metav1.TypeMeta, objectMeta metav1.ObjectMeta) string {
// resource id example: apps/v1:Deployment:code-city:code-citydev
id := typeMeta.APIVersion + ":" + typeMeta.Kind + ":"
if objectMeta.Namespace != "" {
id += objectMeta.Namespace + ":"
}
id += objectMeta.Name
return id
}

// appendToSpec adds a Kubernetes resource to a spec's resources
// slice.
func appendToSpec(resourceID string, resource any, spec *models.Spec) error {
Expand Down Expand Up @@ -86,39 +113,11 @@ func uniqueWorkloadLabels(projectName, appName string) map[string]string {
}
}

// int32Ptr returns a pointer to an int32 value.
func int32Ptr(i int32) *int32 {
return &i
}

// foreachOrderedContainers executes the given function on each
// container in the map in order of their keys.
func foreachOrderedContainers(
m map[string]container.Container,
f func(containerName string, c container.Container) error,
) error {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}

sort.Strings(keys)

for _, k := range keys {
v := m[k]
if err := f(k, v); err != nil {
return err
}
}

return nil
}

func toOrderedContainers(appContainers map[string]container.Container) ([]corev1.Container, error) {
// Create a slice of containers based on the app's
// containers.
containers := []corev1.Container{}
if err := foreachOrderedContainers(appContainers, func(containerName string, c container.Container) error {
if err := ForeachOrdered(appContainers, func(containerName string, c container.Container) error {
// Create a slice of env vars based on the container's
// envvars.
envs := []corev1.EnvVar{}
Expand All @@ -145,26 +144,3 @@ func toOrderedContainers(appContainers map[string]container.Container) ([]corev1
}
return containers, nil
}

// ForeachOrderedApps executes the given function on each
// app in the map in order of their keys.
func ForeachOrderedApps(
m map[string]appconfiguration.AppConfiguration,
f func(appName string, app appconfiguration.AppConfiguration) error,
) error {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}

sort.Strings(keys)

for _, k := range keys {
v := m[k]
if err := f(k, v); err != nil {
return err
}
}

return nil
}

0 comments on commit 8d76703

Please sign in to comment.