thefactory/marathon-python

marathon.exceptions.InvalidChoiceError: Invalid choice "tcp,udp" for param "protocol". Must be one of ['tcp', 'udp']

Closed this issue · 1 comments

If you have a config with:

{
          "containerPort": 514,
          "hostPort": 1514,
          "protocol": "udp,tcp",
          "labels": {}
}

You got the error:

Unexpected error: <class 'marathon.exceptions.InvalidChoiceError'>
Traceback (most recent call last):
File "deployment.py", line 90, in <module>
main()
File "deployment.py", line 84, in main
deploy(service,appid,instances,marathon,down)
File "deployment.py", line 42, in deploy
for app in c.list_apps():
File "/usr/local/lib/python3.5/site-packages/marathon/client.py", line 183, in list_apps
response, MarathonApp, is_list=True, resource_name='apps')
File "/usr/local/lib/python3.5/site-packages/marathon/client.py", line 53, in _parse_response
return [clazz.from_json(resource) for resource in target]
File "/usr/local/lib/python3.5/site-packages/marathon/client.py", line 53, in <listcomp>
return [clazz.from_json(resource) for resource in target]
File "/usr/local/lib/python3.5/site-packages/marathon/models/base.py", line 35, in from_json
return cls(**
{to_snake_case(k): v for k, v in attributes.items()}
)
File "/usr/local/lib/python3.5/site-packages/marathon/models/app.py", line 107, in _init_
else MarathonContainer.from_json(container)
File "/usr/local/lib/python3.5/site-packages/marathon/models/base.py", line 35, in from_json
return cls(**
{to_snake_case(k): v for k, v in attributes.items()}
)
File "/usr/local/lib/python3.5/site-packages/marathon/models/container.py", line 26, in _init_
else MarathonDockerContainer().from_json(docker)
File "/usr/local/lib/python3.5/site-packages/marathon/models/base.py", line 35, in from_json
return cls(**
{to_snake_case(k): v for k, v in attributes.items()}
)
File "/usr/local/lib/python3.5/site-packages/marathon/models/container.py", line 63, in _init_
for pm in (port_mappings or [])
File "/usr/local/lib/python3.5/site-packages/marathon/models/container.py", line 63, in <listcomp>
for pm in (port_mappings or [])
File "/usr/local/lib/python3.5/site-packages/marathon/models/base.py", line 35, in from_json
return cls(**
{to_snake_case(k): v for k, v in attributes.items()}
)
File "/usr/local/lib/python3.5/site-packages/marathon/models/container.py", line 92, in _init_
raise InvalidChoiceError('protocol', protocol, self.PROTOCOLS)
marathon.exceptions.InvalidChoiceError: Invalid choice "tcp,udp" for param "protocol". Must be one of ['tcp', 'udp']

But according to the documentation is it possible (https://mesosphere.github.io/marathon/docs/ports.html)

protocol: Protocol specifies the internet protocol to use for a port (e.g. tcp, udp or udp,tcp for both). This is only necessary as part of a port mapping when using BRIDGE or USER mode networking with a Docker container.

I think it's really easy to fix:
https://github.com/thefactory/marathon-python/blob/master/marathon/models/container.py#L83

PROTOCOLS = ['tcp', 'udp','udp,tcp','tcp,udp']