@click.option("--description", help="human readable description")
@click.option(
"--vim_account",
- help="list of VIM accounts (in the same VIM) that can reach this PDU",
+ help="list of VIM accounts (in the same VIM) that can reach this PDU\n"
+ + "The format for multiple VIMs is --vim_account <vim_account_id_1> "
+ + "--vim_account <vim_account_id_2> ... --vim_account <vim_account_id_N>",
multiple=True,
)
@click.option(
"--descriptor_file",
default=None,
- help="PDU descriptor file (as an alternative to using the other arguments",
+ help="PDU descriptor file (as an alternative to using the other arguments)",
)
@click.pass_context
def pdu_create(
):
"""creates a new Physical Deployment Unit (PDU)"""
logger.debug("")
- # try:
+
check_client_version(ctx.obj, ctx.command.name)
+
+ pdu = create_pdu_dictionary(name, pdu_type, interface, description, vim_account, descriptor_file)
+ ctx.obj.pdu.create(pdu)
+
+
+########################
+# UPDATE PDU operation #
+########################
+
+
+@cli_osm.command(
+ name="pdu-update", short_help="updates a Physical Deployment Unit to the catalog"
+)
+@click.argument("name")
+@click.option("--newname", help="New name for the Physical Deployment Unit")
+@click.option("--pdu_type", help="type of PDU (e.g. router, firewall, FW001)")
+@click.option(
+ "--interface",
+ help="interface(s) of the PDU: name=<NAME>,mgmt=<true|false>,ip-address=<IP_ADDRESS>"
+ + "[,type=<overlay|underlay>][,mac-address=<MAC_ADDRESS>][,vim-network-name=<VIM_NET_NAME>]",
+ multiple=True,
+)
+@click.option("--description", help="human readable description")
+@click.option(
+ "--vim_account",
+ help="list of VIM accounts (in the same VIM) that can reach this PDU\n"
+ + "The format for multiple VIMs is --vim_account <vim_account_id_1> "
+ + "--vim_account <vim_account_id_2> ... --vim_account <vim_account_id_N>",
+ multiple=True,
+)
+@click.option(
+ "--descriptor_file",
+ default=None,
+ help="PDU descriptor file (as an alternative to using the other arguments)",
+)
+@click.pass_context
+def pdu_update(
+ ctx, name, newname, pdu_type, interface, description, vim_account, descriptor_file
+):
+ """Updates a new Physical Deployment Unit (PDU)"""
+ logger.debug("")
+
+ check_client_version(ctx.obj, ctx.command.name)
+
+ update = True
+
+ if not newname:
+ newname = name
+
+ pdu = create_pdu_dictionary(newname, pdu_type, interface, description, vim_account, descriptor_file, update)
+ ctx.obj.pdu.update(name, pdu)
+
+
+def create_pdu_dictionary(name, pdu_type, interface, description, vim_account, descriptor_file, update=False):
+
+ logger.debug("")
pdu = {}
+
if not descriptor_file:
- if not name:
- raise ClientException(
- 'in absence of descriptor file, option "--name" is mandatory'
- )
- if not pdu_type:
- raise ClientException(
- 'in absence of descriptor file, option "--pdu_type" is mandatory'
- )
- if not interface:
- raise ClientException(
- 'in absence of descriptor file, option "--interface" is mandatory (at least once)'
- )
- if not vim_account:
- raise ClientException(
- 'in absence of descriptor file, option "--vim_account" is mandatory (at least once)'
- )
+ if not update:
+ if not name:
+ raise ClientException(
+ 'in absence of descriptor file, option "--name" is mandatory'
+ )
+ if not pdu_type:
+ raise ClientException(
+ 'in absence of descriptor file, option "--pdu_type" is mandatory'
+ )
+ if not interface:
+ raise ClientException(
+ 'in absence of descriptor file, option "--interface" is mandatory (at least once)'
+ )
+ if not vim_account:
+ raise ClientException(
+ 'in absence of descriptor file, option "--vim_account" is mandatory (at least once)'
+ )
else:
with open(descriptor_file, "r") as df:
pdu = yaml.safe_load(df.read())
new_iface["mgmt"] = new_iface.get("mgmt", "false").lower() == "true"
ifaces_list.append(new_iface)
pdu["interfaces"] = ifaces_list
- ctx.obj.pdu.create(pdu)
- # except ClientException as e:
- # print(str(e))
- # exit(1)
-
+ return pdu
####################
# UPDATE operations
self._apiName, self._apiVersion, self._apiResource
)
+ def _get_vim_account(self, vim_account):
+ vim = self._client.vim.get(vim_account)
+ if vim is None:
+ raise NotFound("cannot find vim account '{}'".format(vim_account))
+ return vim
+
def list(self, filter=None):
self._logger.debug("")
self._client.get_token()
def create(self, pdu, update_endpoint=None):
self._logger.debug("")
+
+ if pdu["vim_accounts"]:
+ vim_account_list = []
+ for vim_account in pdu["vim_accounts"]:
+ vim = self._get_vim_account(vim_account)
+ vim_account_list.append(vim["_id"])
+ pdu["vim_accounts"] = vim_account_list
+
self._client.get_token()
headers = self._client._headers
headers["Content-Type"] = "application/yaml"
]
self._http.set_http_header(http_header)
if update_endpoint:
- http_code, resp = self._http.put_cmd(
+ http_code, resp = self._http.patch_cmd(
endpoint=update_endpoint, postfields_dict=pdu
)
else:
http_code, resp = self._http.post_cmd(
endpoint=endpoint, postfields_dict=pdu
)
- # print('HTTP CODE: {}'.format(http_code))
- # print('RESP: {}'.format(resp))
- # if http_code in (200, 201, 202, 204):
- if resp:
- resp = json.loads(resp)
- if not resp or "id" not in resp:
- raise ClientException("unexpected response from server: {}".format(resp))
- print(resp["id"])
- # else:
- # msg = "Error {}".format(http_code)
- # if resp:
- # try:
- # msg = "{} - {}".format(msg, json.loads(resp))
- # except ValueError:
- # msg = "{} - {}".format(msg, resp)
- # raise ClientException("failed to create/update pdu - {}".format(msg))
+ if http_code in (200, 201, 202):
+ if resp:
+ resp = json.loads(resp)
+ if not resp or "id" not in resp:
+ raise ClientException(
+ "unexpected response from server: {}".format(resp)
+ )
+ print(resp["id"])
+ elif http_code == 204:
+ print("Updated")
- def update(self, name, filename):
+ def update(self, name, pdu):
self._logger.debug("")
pdud = self.get(name)
endpoint = "{}/{}".format(self._apiBase, pdud["_id"])
- self.create(filename=filename, update_endpoint=endpoint)
+ self.create(pdu=pdu, update_endpoint=endpoint)