github.com/argoproj/argo-cd/v2@v2.10.9/resource_customizations/argoproj.io/CronWorkflow/actions/create-workflow/action.lua (about) 1 local os = require("os") 2 3 -- This action constructs a Workflow resource from a CronWorkflow resource, to enable creating a CronWorkflow instance 4 -- on demand. 5 -- It returns an array with a single member - a table with the operation to perform (create) and the Workflow resource. 6 -- It mimics the output of "argo submit --from=CronWorkflow/<CRON_WORKFLOW_NAME>" command, declaratively. 7 8 -- This code is written to mimic what the Argo Workflows API server does to create a Workflow from a CronWorkflow. 9 -- https://github.com/argoproj/argo-workflows/blob/873a58de7dd9dad76d5577b8c4294a58b52849b8/workflow/common/convert.go#L12 10 11 -- Deep-copying an object is a ChatGPT generated code. 12 -- Since empty tables are treated as empty arrays, the resulting k8s resource might be invalid (arrays instead of maps). 13 -- So empty tables are not cloned to the target object. 14 function deepCopy(object) 15 local lookup_table = {} 16 local function _copy(obj) 17 if type(obj) ~= "table" then 18 return obj 19 elseif lookup_table[obj] then 20 return lookup_table[obj] 21 elseif next(obj) == nil then 22 return nil 23 else 24 local new_table = {} 25 lookup_table[obj] = new_table 26 for key, value in pairs(obj) do 27 new_table[_copy(key)] = _copy(value) 28 end 29 return setmetatable(new_table, getmetatable(obj)) 30 end 31 end 32 return _copy(object) 33 end 34 35 local workflow = {} 36 workflow.apiVersion = "argoproj.io/v1alpha1" 37 workflow.kind = "Workflow" 38 39 workflow.metadata = {} 40 workflow.metadata.name = obj.metadata.name .. "-" ..os.date("!%Y%m%d%H%M") 41 workflow.metadata.namespace = obj.metadata.namespace 42 workflow.metadata.labels = {} 43 workflow.metadata.annotations = {} 44 if (obj.spec.workflowMetadata ~= nil) then 45 if (obj.spec.workflowMetadata.labels ~= nil) then 46 workflow.metadata.labels = deepCopy(obj.spec.workflowMetadata.labels) 47 end 48 if (obj.spec.workflowMetadata.annotations ~= nil) then 49 workflow.metadata.annotations = deepCopy(obj.spec.workflowMetadata.annotations) 50 end 51 end 52 workflow.metadata.labels["workflows.argoproj.io/cron-workflow"] = obj.metadata.name 53 if (obj.metadata.labels ~= nil and obj.metadata.labels["workflows.argoproj.io/controller-instanceid"] ~= nil) then 54 workflow.metadata.labels["workflows.argoproj.io/controller-instanceid"] = obj.metadata.labels["workflows.argoproj.io/controller-instanceid"] 55 end 56 workflow.metadata.annotations["workflows.argoproj.io/scheduled-time"] = os.date("!%Y-%m-%dT%d:%H:%MZ") 57 58 workflow.finalizers = {} 59 -- add all finalizers from obj.spec.workflowMetadata.finalizers 60 if (obj.spec.workflowMetadata ~= nil and obj.spec.workflowMetadata.finalizers ~= nil) then 61 for i, finalizer in ipairs(obj.spec.workflowMetadata.finalizers) do 62 workflow.finalizers[i] = finalizer 63 end 64 end 65 66 local ownerRef = {} 67 ownerRef.apiVersion = obj.apiVersion 68 ownerRef.kind = obj.kind 69 ownerRef.name = obj.metadata.name 70 ownerRef.uid = obj.metadata.uid 71 workflow.metadata.ownerReferences = {} 72 workflow.metadata.ownerReferences[1] = ownerRef 73 74 workflow.spec = deepCopy(obj.spec.workflowSpec) 75 76 local impactedResource = {} 77 impactedResource.operation = "create" 78 impactedResource.resource = workflow 79 local result = {} 80 result[1] = impactedResource 81 82 return result