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