diff --git a/kontrol-service/engine/docker.go b/kontrol-service/engine/docker.go index d35ae61..842b7d2 100644 --- a/kontrol-service/engine/docker.go +++ b/kontrol-service/engine/docker.go @@ -46,14 +46,9 @@ func GenerateProdDevCluster(baseClusterTopologyMaybeWithTemplateOverrides *resol return nil, stacktrace.NewError("Service with UUID %s has no DeploymentSpec", devServiceName) } - deploymentSpec := flow.DeepCopyDeploymentSpec(devService.DeploymentSpec) - - // TODO: find a better way to update deploymentSpec, this assumes there is only container in the pod - deploymentSpec.Template.Spec.Containers[0].Image = item.Image - patches = append(patches, flow_spec.ServicePatch{ - Service: devServiceName, - DeploymentSpec: deploymentSpec, + Service: devServiceName, + Image: item.Image, }) } diff --git a/kontrol-service/engine/flow/dev_flow.go b/kontrol-service/engine/flow/dev_flow.go index a4ff802..3e1e85a 100644 --- a/kontrol-service/engine/flow/dev_flow.go +++ b/kontrol-service/engine/flow/dev_flow.go @@ -14,8 +14,6 @@ import ( "kardinal.kontrol-service/plugins" "kardinal.kontrol-service/types/cluster_topology/resolved" "kardinal.kontrol-service/types/flow_spec" - - v1 "k8s.io/api/apps/v1" ) // CreateDevFlow creates a dev flow from the given topologies @@ -56,7 +54,7 @@ func CreateDevFlow( if err != nil { return nil, err } - _, err = applyPatch(pluginRunner, topologyRef, clusterGraph, flowID, targetService, servicePatch.DeploymentSpec) + _, err = applyPatch(pluginRunner, topologyRef, clusterGraph, flowID, targetService, servicePatch.Image) if err != nil { return nil, err } @@ -147,7 +145,7 @@ func applyPatch( clusterGraph graph.Graph[resolved.ServiceHash, *resolved.Service], flowID string, targetService *resolved.Service, - deploymentSpec *v1.DeploymentSpec, + newImage string, ) (*resolved.ClusterTopology, error) { // Find downstream stateful services statefulPaths := findAllDownstreamStatefulPaths(targetService, clusterGraph, topology) @@ -167,7 +165,7 @@ func applyPatch( externalPaths := findAllDownstreamExternalPaths(targetService, clusterGraph, topology) externalServices := make([]*resolved.Service, 0) - alreadyHandledExternalServices := make([]string, 0) + for _, path := range externalPaths { externalServiceHash, err := lo.Last(path) if externalServiceHash == "" || err != nil { @@ -206,7 +204,8 @@ func applyPatch( } modifiedTargetService := DeepCopyService(targetService) - modifiedTargetService.DeploymentSpec = deploymentSpec + // TODO: find a better way to update deploymentSpec, this assumes there is only container in the pod + modifiedTargetService.DeploymentSpec.Template.Spec.Containers[0].Image = newImage modifiedTargetService.Version = flowID err := topology.UpdateWithService(modifiedTargetService) if err != nil { @@ -266,7 +265,7 @@ func applyPatch( } // if the service is an external service of the target service, it was already handled above - if lo.Contains(externalServices, service) && !lo.Contains(alreadyHandledExternalServices, service.ServiceID) { + if lo.Contains(externalServices, service) { // assume there's only one parent service for now but eventually we'll likely need to account for multiple parents to external service parentServices := topology.FindImmediateParents(service) if len(parentServices) == 0 { diff --git a/kontrol-service/engine/flow/dev_flow_test.go b/kontrol-service/engine/flow/dev_flow_test.go index 45504e9..cf2b5b8 100644 --- a/kontrol-service/engine/flow/dev_flow_test.go +++ b/kontrol-service/engine/flow/dev_flow_test.go @@ -19,7 +19,13 @@ import ( const dummyPluginName = "https://github.com/h4ck3rk3y/identity-plugin.git" func clusterTopologyExample() resolved.ClusterTopology { - dummySpec := &appsv1.DeploymentSpec{} + dummySpec := &appsv1.DeploymentSpec{ + Template: v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + Containers: []v1.Container{{Image: "dummy-image"}}, + }, + }, + } testPlugins := []*resolved.StatefulPlugin{ { Name: dummyPluginName, @@ -710,8 +716,8 @@ func TestDevFlowImmutability(t *testing.T) { FlowId: "dev-flow-1", ServicePatches: []flow_spec.ServicePatch{ { - Service: "checkoutservice", - DeploymentSpec: checkoutservice.DeploymentSpec, + Service: "checkoutservice", + Image: checkoutservice.DeploymentSpec.Template.Spec.Containers[0].Image, }, }, } @@ -761,8 +767,8 @@ func TestFlowMerging(t *testing.T) { FlowId: "dev-flow-1", ServicePatches: []flow_spec.ServicePatch{ { - Service: "checkoutservice", - DeploymentSpec: checkoutservice.DeploymentSpec, + Service: "checkoutservice", + Image: checkoutservice.DeploymentSpec.Template.Spec.Containers[0].Image, }, }, } @@ -800,8 +806,8 @@ func TestExternalServicesFlowOnDependentService(t *testing.T) { FlowId: "dev-flow-1", ServicePatches: []flow_spec.ServicePatch{ { - Service: "cartservice", - DeploymentSpec: cartservice.DeploymentSpec, + Service: "cartservice", + Image: cartservice.DeploymentSpec.Template.Spec.Containers[0].Image, }, }, } @@ -833,8 +839,8 @@ func TestExternalServicesCreateDevFlowOnNotDependentService(t *testing.T) { FlowId: "dev-flow-1", ServicePatches: []flow_spec.ServicePatch{ { - Service: "frontend", - DeploymentSpec: frontend.DeploymentSpec, + Service: "frontend", + Image: frontend.DeploymentSpec.Template.Spec.Containers[0].Image, }, }, } diff --git a/kontrol-service/engine/flow/render.go b/kontrol-service/engine/flow/render.go index 6646776..9c072ae 100644 --- a/kontrol-service/engine/flow/render.go +++ b/kontrol-service/engine/flow/render.go @@ -882,7 +882,7 @@ func generateDynamicLuaScript(allServices []*resolved.Service, flowId string, na service = fallbackService } if service == nil { - logrus.Errorf("No service found for '%s' for version '%s' or baseline '%s'. No routing can configured.", serviceID, flowId, &baselineFlowVersion) + logrus.Errorf("No service found for '%s' for version '%s' or baseline '%s'. No routing can configured.", serviceID, flowId, baselineFlowVersion) continue } diff --git a/kontrol-service/types/flow_spec/resolved.go b/kontrol-service/types/flow_spec/resolved.go index 9268e78..ce296cb 100644 --- a/kontrol-service/types/flow_spec/resolved.go +++ b/kontrol-service/types/flow_spec/resolved.go @@ -1,13 +1,11 @@ package flow_spec -import v1 "k8s.io/api/apps/v1" - type FlowPatch struct { FlowId string ServicePatches []ServicePatch } type ServicePatch struct { - Service string - DeploymentSpec *v1.DeploymentSpec + Service string + Image string }