Skip to content

ValueError: Invalid value for steps, must not be None when listing workflows #22

@brtasavpatel

Description

@brtasavpatel

Hello I am trying to list workflows from within a Pod which is in my k8s cluster and have following service account applied on it.

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-api
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-api-argo-roles
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: 'true'
rules:
  - verbs:
      - create
      - delete
      - deletecollection
      - get
      - list
      - patch
      - update
      - watch
    apiGroups:
      - argoproj.io
    resources:
      - workflows
      - workflows/finalizers
      - workflowtemplates
      - workflowtemplates/finalizers
      - cronworkflows
      - cronworkflows/finalizers
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: mu-api-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: my-api-argo-roles
subjects:
- kind: ServiceAccount
  name: my-api
  namespace: default

when I try to list workflows from default namespace I get this error :

In [9]: from argo.workflows.client import V1alpha1Api
   ...: from argo.workflows.config import load_incluster_config
   ...:
   ...: load_incluster_config()  # loads local configuration from ~/.kube/confi
   ...: v1alpha1 = V1alpha1Api()
   ...:
   ...: wfs = v1alpha1.list_namespaced_workflows(namespace='default')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-c36ca0651faf> in <module>
      5 v1alpha1 = V1alpha1Api()
      6
----> 7 wfs = v1alpha1.list_namespaced_workflows(namespace='default')

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api/v1alpha1_api.py in list_namespaced_workflows(self, namespace, **kwargs)
   1613             return self.list_namespaced_workflows_with_http_info(namespace, **kwargs)  # noqa: E501
   1614         else:
-> 1615             (data) = self.list_namespaced_workflows_with_http_info(namespace, **kwargs)  # noqa: E501
   1616             return data
   1617

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api/v1alpha1_api.py in list_namespaced_workflows_with_http_info(self, namespace, **kwargs)
   1706             _preload_content=params.get('_preload_content', True),
   1707             _request_timeout=params.get('_request_timeout'),
-> 1708             collection_formats=collection_formats)
   1709
   1710     def list_namespaced_workflowtemplates(self, namespace, **kwargs):  # noqa: E501

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in call_api(self, resource_path, method, path_params, query_params, header_params, body, post_params, files, response_type, auth_settings, async_req, _return_http_data_only, collection_formats, _preload_content, _request_timeout)
    328                                    response_type, auth_settings,
    329                                    _return_http_data_only, collection_formats,
--> 330                                    _preload_content, _request_timeout)
    331         else:
    332             thread = self.pool.apply_async(self.__call_api, (resource_path,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __call_api(self, resource_path, method, path_params, query_params, header_params, body, post_params, files, response_type, auth_settings, _return_http_data_only, collection_formats, _preload_content, _request_timeout)
    167             # deserialize response data
    168             if response_type:
--> 169                 return_data = self.deserialize(response_data, response_type)
    170             else:
    171                 return_data = None

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in deserialize(self, response, response_type)
    239             data = response.data
    240
--> 241         return self.__deserialize(data, response_type)
    242
    243     def __deserialize(self, data, klass):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    278             return self.__deserialize_datatime(data)
    279         else:
--> 280             return self.__deserialize_model(data, klass)
    281
    282     def call_api(self, resource_path, method,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize_model(self, data, klass)
    622                         isinstance(data, (list, dict))):
    623                     value = data[klass.attribute_map[attr]]
--> 624                     kwargs[attr] = self.__deserialize(value, attr_type)
    625
    626         instance = klass(**kwargs)

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in <listcomp>(.0)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    278             return self.__deserialize_datatime(data)
    279         else:
--> 280             return self.__deserialize_model(data, klass)
    281
    282     def call_api(self, resource_path, method,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize_model(self, data, klass)
    622                         isinstance(data, (list, dict))):
    623                     value = data[klass.attribute_map[attr]]
--> 624                     kwargs[attr] = self.__deserialize(value, attr_type)
    625
    626         instance = klass(**kwargs)

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    278             return self.__deserialize_datatime(data)
    279         else:
--> 280             return self.__deserialize_model(data, klass)
    281
    282     def call_api(self, resource_path, method,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize_model(self, data, klass)
    622                         isinstance(data, (list, dict))):
    623                     value = data[klass.attribute_map[attr]]
--> 624                     kwargs[attr] = self.__deserialize(value, attr_type)
    625
    626         instance = klass(**kwargs)

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in <listcomp>(.0)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    278             return self.__deserialize_datatime(data)
    279         else:
--> 280             return self.__deserialize_model(data, klass)
    281
    282     def call_api(self, resource_path, method,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize_model(self, data, klass)
    622                         isinstance(data, (list, dict))):
    623                     value = data[klass.attribute_map[attr]]
--> 624                     kwargs[attr] = self.__deserialize(value, attr_type)
    625
    626         instance = klass(**kwargs)

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in <listcomp>(.0)
    256                 sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
    257                 return [self.__deserialize(sub_data, sub_kls)
--> 258                         for sub_data in data]
    259
    260             if klass.startswith('dict('):

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize(self, data, klass)
    278             return self.__deserialize_datatime(data)
    279         else:
--> 280             return self.__deserialize_model(data, klass)
    281
    282     def call_api(self, resource_path, method,

/usr/local/lib/python3.6/site-packages/argo/workflows/client/api_client.py in __deserialize_model(self, data, klass)
    624                     kwargs[attr] = self.__deserialize(value, attr_type)
    625
--> 626         instance = klass(**kwargs)
    627
    628         if (isinstance(instance, dict) and

/usr/local/lib/python3.6/site-packages/argo/workflows/client/models/v1alpha1_parallel_steps.py in __init__(self, steps)
     45         self.discriminator = None
     46
---> 47         self.steps = steps
     48
     49     @property

/usr/local/lib/python3.6/site-packages/argo/workflows/client/models/v1alpha1_parallel_steps.py in steps(self, steps)
     66         """
     67         if steps is None:
---> 68             raise ValueError("Invalid value for `steps`, must not be `None`")  # noqa: E501
     69
     70         self._steps = steps

ValueError: Invalid value for `steps`, must not be `None`

but if I do list_namespaced_workflows on namespace='argo' it works fine :

In [19]: from argo.workflows.client import V1alpha1Api
    ...: from argo.workflows.config import load_incluster_config
    ...:
    ...: load_incluster_config()  # loads local configuration from ~/.kube/confi
    ...: v1alpha1 = V1alpha1Api()
    ...:
    ...: wfs = v1alpha1.list_namespaced_workflows(namespace='argo')

In [20]: wfs.items[0]
Out[20]:
{'api_version': 'argoproj.io/v1alpha1',
 'kind': 'Workflow',
 'metadata': {'annotations': None,
              'cluster_name': None,
...
...

my environment :

Python v3.6.10

pip list | grep -i 'kubernetes\|argo'
argo-workflows       3.0.2
argo-workflows-dsl   0.1.0.dev0
kubernetes           10.0.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions