libcloud/compute/drivers/dimensiondata.py [2614:3221]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            if e.code != "RESOURCE_NOT_FOUND":
                raise e
        return self.ex_get_customer_image_by_id(id)

    def ex_create_tag_key(
        self, name, description=None, value_required=True, display_on_report=True
    ):
        """
        Creates a tag key in the Dimension Data Cloud

        :param name: The name of the tag key (required)
        :type  name: ``str``

        :param description: The description of the tag key
        :type  description: ``str``

        :param value_required: If a value is required for the tag
                               Tags themselves can be just a tag,
                               or be a key/value pair
        :type  value_required: ``bool``

        :param display_on_report: Should this key show up on the usage reports
        :type  display_on_report: ``bool``

        :rtype: ``bool``
        """
        create_tag_key = ET.Element("createTagKey", {"xmlns": TYPES_URN})
        ET.SubElement(create_tag_key, "name").text = name
        if description is not None:
            ET.SubElement(create_tag_key, "description").text = description
        ET.SubElement(create_tag_key, "valueRequired").text = str(value_required).lower()
        ET.SubElement(create_tag_key, "displayOnReport").text = str(display_on_report).lower()
        response = self.connection.request_with_orgId_api_2(
            "tag/createTagKey", method="POST", data=ET.tostring(create_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_list_tag_keys(self, id=None, name=None, value_required=None, display_on_report=None):
        """
        List tag keys in the Dimension Data Cloud

        :param id: Filter the list to the id of the tag key
        :type  id: ``str``

        :param name: Filter the list to the name of the tag key
        :type  name: ``str``

        :param value_required: Filter the list to if a value is required
                               for a tag key
        :type  value_required: ``bool``

        :param display_on_report: Filter the list to if the tag key should
                                  show up on usage reports
        :type  display_on_report: ``bool``

        :rtype: ``list`` of :class:`DimensionDataTagKey`
        """
        params = {}
        if id is not None:
            params["id"] = id
        if name is not None:
            params["name"] = name
        if value_required is not None:
            params["valueRequired"] = str(value_required).lower()
        if display_on_report is not None:
            params["displayOnReport"] = str(display_on_report).lower()

        paged_result = self.connection.paginated_request_with_orgId_api_2(
            "tag/tagKey", method="GET", params=params
        )

        tag_keys = []
        for result in paged_result:
            tag_keys.extend(self._to_tag_keys(result))
        return tag_keys

    def ex_get_tag_key_by_id(self, id):
        """
        Get a specific tag key by ID

        :param id: ID of the tag key you want (required)
        :type  id: ``str``

        :rtype: :class:`DimensionDataTagKey`
        """
        tag_key = self.connection.request_with_orgId_api_2("tag/tagKey/%s" % id).object
        return self._to_tag_key(tag_key)

    def ex_get_tag_key_by_name(self, name):
        """
        Get a specific tag key by Name

        :param name: Name of the tag key you want (required)
        :type  name: ``str``

        :rtype: :class:`DimensionDataTagKey`
        """
        tag_keys = self.ex_list_tag_keys(name=name)
        if len(tag_keys) != 1:
            raise ValueError("No tags found with name %s" % name)
        return tag_keys[0]

    def ex_modify_tag_key(
        self,
        tag_key,
        name=None,
        description=None,
        value_required=None,
        display_on_report=None,
    ):
        """
        Modify a specific tag key

        :param tag_key: The tag key you want to modify (required)
        :type  tag_key: :class:`DimensionDataTagKey` or ``str``

        :param name: Set to modify the name of the tag key
        :type  name: ``str``

        :param description: Set to modify the description of the tag key
        :type  description: ``str``

        :param value_required: Set to modify if a value is required for
                               the tag key
        :type  value_required: ``bool``

        :param display_on_report: Set to modify if this tag key should display
                                  on the usage reports
        :type  display_on_report: ``bool``

        :rtype: ``bool``
        """
        tag_key_id = self._tag_key_to_tag_key_id(tag_key)
        modify_tag_key = ET.Element("editTagKey", {"xmlns": TYPES_URN, "id": tag_key_id})
        if name is not None:
            ET.SubElement(modify_tag_key, "name").text = name
        if description is not None:
            ET.SubElement(modify_tag_key, "description").text = description
        if value_required is not None:
            ET.SubElement(modify_tag_key, "valueRequired").text = str(value_required).lower()
        if display_on_report is not None:
            ET.SubElement(modify_tag_key, "displayOnReport").text = str(display_on_report).lower()

        response = self.connection.request_with_orgId_api_2(
            "tag/editTagKey", method="POST", data=ET.tostring(modify_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_remove_tag_key(self, tag_key):
        """
        Modify a specific tag key

        :param tag_key: The tag key you want to remove (required)
        :type  tag_key: :class:`DimensionDataTagKey` or ``str``

        :rtype: ``bool``
        """
        tag_key_id = self._tag_key_to_tag_key_id(tag_key)
        remove_tag_key = ET.Element("deleteTagKey", {"xmlns": TYPES_URN, "id": tag_key_id})
        response = self.connection.request_with_orgId_api_2(
            "tag/deleteTagKey", method="POST", data=ET.tostring(remove_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_apply_tag_to_asset(self, asset, tag_key, value=None):
        """
        Apply a tag to a Dimension Data Asset

        :param asset: The asset to apply a tag to. (required)
        :type  asset: :class:`Node` or :class:`NodeImage` or
                      :class:`DimensionDataNewtorkDomain` or
                      :class:`DimensionDataVlan` or
                      :class:`DimensionDataPublicIpBlock`

        :param tag_key: The tag_key to apply to the asset. (required)
        :type  tag_key: :class:`DimensionDataTagKey` or ``str``

        :param value: The value to be assigned to the tag key
                      This is only required if the :class:`DimensionDataTagKey`
                      requires it
        :type  value: ``str``

        :rtype: ``bool``
        """
        asset_type = self._get_tagging_asset_type(asset)
        tag_key_name = self._tag_key_to_tag_key_name(tag_key)

        apply_tags = ET.Element("applyTags", {"xmlns": TYPES_URN})
        ET.SubElement(apply_tags, "assetType").text = asset_type
        ET.SubElement(apply_tags, "assetId").text = asset.id

        tag_ele = ET.SubElement(apply_tags, "tag")
        ET.SubElement(tag_ele, "tagKeyName").text = tag_key_name
        if value is not None:
            ET.SubElement(tag_ele, "value").text = value

        response = self.connection.request_with_orgId_api_2(
            "tag/applyTags", method="POST", data=ET.tostring(apply_tags)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_remove_tag_from_asset(self, asset, tag_key):
        """
        Remove a tag from an asset

        :param asset: The asset to remove a tag from. (required)
        :type  asset: :class:`Node` or :class:`NodeImage` or
                      :class:`DimensionDataNewtorkDomain` or
                      :class:`DimensionDataVlan` or
                      :class:`DimensionDataPublicIpBlock`

        :param tag_key: The tag key you want to remove (required)
        :type  tag_key: :class:`DimensionDataTagKey` or ``str``

        :rtype: ``bool``
        """
        asset_type = self._get_tagging_asset_type(asset)
        tag_key_name = self._tag_key_to_tag_key_name(tag_key)

        apply_tags = ET.Element("removeTags", {"xmlns": TYPES_URN})
        ET.SubElement(apply_tags, "assetType").text = asset_type
        ET.SubElement(apply_tags, "assetId").text = asset.id
        ET.SubElement(apply_tags, "tagKeyName").text = tag_key_name
        response = self.connection.request_with_orgId_api_2(
            "tag/removeTags", method="POST", data=ET.tostring(apply_tags)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_list_tags(
        self,
        asset_id=None,
        asset_type=None,
        location=None,
        tag_key_name=None,
        tag_key_id=None,
        value=None,
        value_required=None,
        display_on_report=None,
    ):
        """
        List tags in the Dimension Data Cloud

        :param asset_id: Filter the list by asset id
        :type  asset_id: ``str``

        :param asset_type: Filter the list by asset type
        :type  asset_type: ``str``

        :param location: Filter the list by the assets location
        :type  location: :class:``NodeLocation`` or ``str``

        :param tag_key_name: Filter the list by a tag key name
        :type  tag_key_name: ``str``

        :param tag_key_id: Filter the list by a tag key id
        :type  tag_key_id: ``str``

        :param value: Filter the list by a tag value
        :type  value: ``str``

        :param value_required: Filter the list to if a value is required
                               for a tag
        :type  value_required: ``bool``

        :param display_on_report: Filter the list to if the tag should
                                  show up on usage reports
        :type  display_on_report: ``bool``

        :rtype: ``list`` of :class:`DimensionDataTag`
        """
        params = {}
        if asset_id is not None:
            params["assetId"] = asset_id
        if asset_type is not None:
            params["assetType"] = asset_type
        if location is not None:
            params["datacenterId"] = self._location_to_location_id(location)
        if tag_key_name is not None:
            params["tagKeyName"] = tag_key_name
        if tag_key_id is not None:
            params["tagKeyId"] = tag_key_id
        if value is not None:
            params["value"] = value
        if value_required is not None:
            params["valueRequired"] = str(value_required).lower()
        if display_on_report is not None:
            params["displayOnReport"] = str(display_on_report).lower()

        paged_result = self.connection.paginated_request_with_orgId_api_2(
            "tag/tag", method="GET", params=params
        )

        tags = []
        for result in paged_result:
            tags.extend(self._to_tags(result))
        return tags

    def ex_summary_usage_report(self, start_date, end_date):
        """
        Get summary usage information

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """
        result = self.connection.raw_request_with_orgId_api_1(
            "report/usage?startDate={}&endDate={}".format(start_date, end_date)
        )
        return self._format_csv(result.response)

    def ex_detailed_usage_report(self, start_date, end_date):
        """
        Get detailed usage information

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """
        result = self.connection.raw_request_with_orgId_api_1(
            "report/usageDetailed?startDate={}&endDate={}".format(start_date, end_date)
        )
        return self._format_csv(result.response)

    def ex_software_usage_report(self, start_date, end_date):
        """
        Get detailed software usage reports

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """
        result = self.connection.raw_request_with_orgId_api_1(
            "report/usageSoftwareUnits?startDate={}&endDate={}".format(start_date, end_date)
        )
        return self._format_csv(result.response)

    def ex_audit_log_report(self, start_date, end_date):
        """
        Get audit log report

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """
        result = self.connection.raw_request_with_orgId_api_1(
            "auditlog?startDate={}&endDate={}".format(start_date, end_date)
        )
        return self._format_csv(result.response)

    def ex_backup_usage_report(self, start_date, end_date, location):
        """
        Get audit log report

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :keyword location: Filters the node list to nodes that are
                           located in this location
        :type    location: :class:`NodeLocation` or ``str``

        :rtype: ``list`` of ``list``
        """
        datacenter_id = self._location_to_location_id(location)
        result = self.connection.raw_request_with_orgId_api_1(
            "backup/detailedUsageReport?datacenterId=%s&fromDate=%s&toDate=%s"
            % (datacenter_id, start_date, end_date)
        )
        return self._format_csv(result.response)

    def ex_list_ip_address_list(self, ex_network_domain):
        """
        List IP Address List by network domain ID specified

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> import libcloud.security
        >>>
        >>> # Get dimension data driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.DIMENSIONDATA)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # List IP Address List of network domain
        >>> ipaddresslist_list = driver.ex_list_ip_address_list(
        >>>     ex_network_domain=my_network_domain)
        >>> pprint(ipaddresslist_list)

        :param  ex_network_domain: The network domain or network domain ID
        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'

        :return: a list of DimensionDataIpAddressList objects
        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
        """
        params = {"networkDomainId": self._network_domain_to_network_domain_id(ex_network_domain)}
        response = self.connection.request_with_orgId_api_2(
            "network/ipAddressList", params=params
        ).object
        return self._to_ip_address_lists(response)

    def ex_get_ip_address_list(self, ex_network_domain, ex_ip_address_list_name):
        """
        Get IP Address List by name in network domain specified

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> import libcloud.security
        >>>
        >>> # Get dimension data driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.DIMENSIONDATA)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # Get IP Address List by Name
        >>> ipaddresslist_list_by_name = driver.ex_get_ip_address_list(
        >>>     ex_network_domain=my_network_domain,
        >>>     ex_ip_address_list_name='My_IP_AddressList_1')
        >>> pprint(ipaddresslist_list_by_name)


        :param  ex_network_domain: (required) The network domain or network
                                   domain ID in which ipaddresslist resides.
        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'

        :param    ex_ip_address_list_name: (required) Get 'IP Address List' by
                                            name
        :type     ex_ip_address_list_name: :``str``

        :return: a list of DimensionDataIpAddressList objects
        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
        """

        ip_address_lists = self.ex_list_ip_address_list(ex_network_domain)
        return list(filter(lambda x: x.name == ex_ip_address_list_name, ip_address_lists))

    def ex_create_ip_address_list(
        self,
        ex_network_domain,
        name,
        description,
        ip_version,
        ip_address_collection,
        child_ip_address_list=None,
    ):
        """
        Create IP Address List. IP Address list.

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> from libcloud.common.dimensiondata import DimensionDataIpAddress
        >>> import libcloud.security
        >>>
        >>> # Get dimension data driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.DIMENSIONDATA)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # IP Address collection
        >>> ipAddress_1 = DimensionDataIpAddress(begin='190.2.2.100')
        >>> ipAddress_2 = DimensionDataIpAddress(begin='190.2.2.106',
                                                 end='190.2.2.108')
        >>> ipAddress_3 = DimensionDataIpAddress(begin='190.2.2.0',
                                                 prefix_size='24')
        >>> ip_address_collection = [ipAddress_1, ipAddress_2, ipAddress_3]
        >>>
        >>> # Create IPAddressList
        >>> result = driver.ex_create_ip_address_list(
        >>>     ex_network_domain=my_network_domain,
        >>>     name='My_IP_AddressList_2',
        >>>     ip_version='IPV4',
        >>>     description='Test only',
        >>>     ip_address_collection=ip_address_collection,
        >>>     child_ip_address_list='08468e26-eeb3-4c3d-8ff2-5351fa6d8a04'
        >>> )
        >>>
        >>> pprint(result)


        :param  ex_network_domain: The network domain or network domain ID
        :type   ex_network_domain: :class:`DimensionDataNetworkDomain` or 'str'

        :param    name:  IP Address List Name (required)
        :type      name: :``str``

        :param    description:  IP Address List Description (optional)
        :type      description: :``str``

        :param    ip_version:  IP Version of ip address (required)
        :type      ip_version: :``str``

        :param    ip_address_collection:  List of IP Address. At least one
                                          ipAddress element or one
                                          childIpAddressListId element must
                                          be provided.
        :type      ip_address_collection: :``str``

        :param    child_ip_address_list:  Child IP Address List or id to be
                                          included in this IP Address List.
                                          At least one ipAddress or
                                          one childIpAddressListId
                                          must be provided.
        :type     child_ip_address_list:
                        :class:'DimensionDataChildIpAddressList` or `str``

        :return: a list of DimensionDataIpAddressList objects
        :rtype: ``list`` of :class:`DimensionDataIpAddressList`
        """
        if ip_address_collection is None and child_ip_address_list is None:
            raise ValueError(
                "At least one ipAddress element or one "
                "childIpAddressListId element must be "
                "provided."
            )

        create_ip_address_list = ET.Element("createIpAddressList", {"xmlns": TYPES_URN})
        ET.SubElement(create_ip_address_list, "networkDomainId").text = (
            self._network_domain_to_network_domain_id(ex_network_domain)
        )

        ET.SubElement(create_ip_address_list, "name").text = name

        ET.SubElement(create_ip_address_list, "description").text = description

        ET.SubElement(create_ip_address_list, "ipVersion").text = ip_version

        for ip in ip_address_collection:
            ip_address = ET.SubElement(
                create_ip_address_list,
                "ipAddress",
            )
            ip_address.set("begin", ip.begin)

            if ip.end:
                ip_address.set("end", ip.end)

            if ip.prefix_size:
                ip_address.set("prefixSize", ip.prefix_size)

        if child_ip_address_list is not None:
            ET.SubElement(create_ip_address_list, "childIpAddressListId").text = (
                self._child_ip_address_list_to_child_ip_address_list_id(child_ip_address_list)
            )

        response = self.connection.request_with_orgId_api_2(
            "network/createIpAddressList",
            method="POST",
            data=ET.tostring(create_ip_address_list),
        ).object

        response_code = findtext(response, "responseCode", TYPES_URN)
        return response_code in ["IN_PROGRESS", "OK"]

    def ex_edit_ip_address_list(
        self,
        ex_ip_address_list,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



libcloud/compute/drivers/nttcis.py [3315:3980]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            if e.code != "RESOURCE_NOT_FOUND":
                raise e

        return self.ex_get_customer_image_by_id(id)

    def ex_create_tag_key(
        self, name, description=None, value_required=True, display_on_report=True
    ):
        """
        Creates a tag key in the NTTC-CIS Cloud

        :param name: The name of the tag key (required)
        :type  name: ``str``

        :param description: The description of the tag key
        :type  description: ``str``

        :param value_required: If a value is required for the tag
                               Tags themselves can be just a tag,
                               or be a key/value pair
        :type  value_required: ``bool``

        :param display_on_report: Should this key show up on the usage reports
        :type  display_on_report: ``bool``

        :rtype: ``bool``
        """

        create_tag_key = ET.Element("createTagKey", {"xmlns": TYPES_URN})
        ET.SubElement(create_tag_key, "name").text = name

        if description is not None:
            ET.SubElement(create_tag_key, "description").text = description
        ET.SubElement(create_tag_key, "valueRequired").text = str(value_required).lower()
        ET.SubElement(create_tag_key, "displayOnReport").text = str(display_on_report).lower()
        response = self.connection.request_with_orgId_api_2(
            "tag/createTagKey", method="POST", data=ET.tostring(create_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_list_tag_keys(self, id=None, name=None, value_required=None, display_on_report=None):
        """
        List tag keys in the NTTC-CIS Cloud

        :param id: Filter the list to the id of the tag key
        :type  id: ``str``

        :param name: Filter the list to the name of the tag key
        :type  name: ``str``

        :param value_required: Filter the list to if a value is required
                               for a tag key
        :type  value_required: ``bool``

        :param display_on_report: Filter the list to if the tag key should
                                  show up on usage reports
        :type  display_on_report: ``bool``

        :rtype: ``list`` of :class:`NttCisTagKey`
        """

        params = {}

        if id is not None:
            params["id"] = id

        if name is not None:
            params["name"] = name

        if value_required is not None:
            params["valueRequired"] = str(value_required).lower()

        if display_on_report is not None:
            params["displayOnReport"] = str(display_on_report).lower()

        paged_result = self.connection.paginated_request_with_orgId_api_2(
            "tag/tagKey", method="GET", params=params
        )

        tag_keys = []

        for result in paged_result:
            tag_keys.extend(self._to_tag_keys(result))

        return tag_keys

    def ex_get_tag_key_by_id(self, id):
        """
        Get a specific tag key by ID

        :param id: ID of the tag key you want (required)
        :type  id: ``str``

        :rtype: :class:`NttCisTagKey`
        """

        tag_key = self.connection.request_with_orgId_api_2("tag/tagKey/%s" % id).object

        return self._to_tag_key(tag_key)

    def ex_get_tag_key_by_name(self, name):
        """
        NOTICE: Tag key is one of those instances where Libloud
                handles the search of a list for the client code.
                This behavior exists inconsistently across libcloud.
                Get a specific tag key by Name

        :param name: Name of the tag key you want (required)
        :type  name: ``str``

        :rtype: :class:`NttCisTagKey`
        """

        tag_keys = self.ex_list_tag_keys(name=name)

        if len(tag_keys) != 1:
            raise ValueError("No tags found with name %s" % name)

        return tag_keys[0]

    def ex_modify_tag_key(
        self,
        tag_key,
        name=None,
        description=None,
        value_required=None,
        display_on_report=None,
    ):
        """
        Modify a specific tag key

        :param tag_key: The tag key you want to modify (required)
        :type  tag_key: :class:`NttCisTagKey` or ``str``

        :param name: Set to modify the name of the tag key
        :type  name: ``str``

        :param description: Set to modify the description of the tag key
        :type  description: ``str``

        :param value_required: Set to modify if a value is required for
                               the tag key
        :type  value_required: ``bool``

        :param display_on_report: Set to modify if this tag key should display
                                  on the usage reports
        :type  display_on_report: ``bool``

        :rtype: ``bool``
        """

        tag_key_id = self._tag_key_to_tag_key_id(tag_key)
        modify_tag_key = ET.Element("editTagKey", {"xmlns": TYPES_URN, "id": tag_key_id})

        if name is not None:
            ET.SubElement(modify_tag_key, "name").text = name

        if description is not None:
            ET.SubElement(modify_tag_key, "description").text = description

        if value_required is not None:
            ET.SubElement(modify_tag_key, "valueRequired").text = str(value_required).lower()

        if display_on_report is not None:
            ET.SubElement(modify_tag_key, "displayOnReport").text = str(display_on_report).lower()

        response = self.connection.request_with_orgId_api_2(
            "tag/editTagKey", method="POST", data=ET.tostring(modify_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_remove_tag_key(self, tag_key):
        """
        Modify a specific tag key

        :param tag_key: The tag key you want to remove (required)
        :type  tag_key: :class:`NttCisTagKey` or ``str``

        :rtype: ``bool``
        """

        tag_key_id = self._tag_key_to_tag_key_id(tag_key)
        remove_tag_key = ET.Element("deleteTagKey", {"xmlns": TYPES_URN, "id": tag_key_id})
        response = self.connection.request_with_orgId_api_2(
            "tag/deleteTagKey", method="POST", data=ET.tostring(remove_tag_key)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_apply_tag_to_asset(self, asset, tag_key, value=None):
        """
        Apply a tag to a NTTC-CIS Asset

        :param asset: The asset to apply a tag to. (required)
        :type  asset: :class:`Node` or :class:`NodeImage` or
                      :class:`NttCisNewtorkDomain` or
                      :class:`NttCisVlan` or
                      :class:`NttCisPublicIpBlock`

        :param tag_key: The tag_key to apply to the asset. (required)
        :type  tag_key: :class:`NttCisTagKey` or ``str``

        :param value: The value to be assigned to the tag key
                      This is only required if the :class:`NttCisTagKey`
                      requires it
        :type  value: ``str``

        :rtype: ``bool``
        """

        asset_type = self._get_tagging_asset_type(asset)
        tag_key_name = self._tag_key_to_tag_key_name(tag_key)

        apply_tags = ET.Element("applyTags", {"xmlns": TYPES_URN})
        ET.SubElement(apply_tags, "assetType").text = asset_type
        ET.SubElement(apply_tags, "assetId").text = asset.id

        tag_ele = ET.SubElement(apply_tags, "tag")
        ET.SubElement(tag_ele, "tagKeyName").text = tag_key_name

        if value is not None:
            ET.SubElement(tag_ele, "value").text = value

        response = self.connection.request_with_orgId_api_2(
            "tag/applyTags", method="POST", data=ET.tostring(apply_tags)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_remove_tag_from_asset(self, asset, tag_key):
        """
        Remove a tag from an asset

        :param asset: The asset to remove a tag from. (required)
        :type  asset: :class:`Node` or :class:`NodeImage` or
                      :class:`NttCisNewtorkDomain` or
                      :class:`NttCisVlan` or
                      :class:`NttCisPublicIpBlock`

        :param tag_key: The tag key you want to remove (required)
        :type  tag_key: :class:`NttCisTagKey` or ``str``

        :rtype: ``bool``
        """

        asset_type = self._get_tagging_asset_type(asset)
        tag_key_name = self._tag_key_to_tag_key_name(tag_key)

        apply_tags = ET.Element("removeTags", {"xmlns": TYPES_URN})
        ET.SubElement(apply_tags, "assetType").text = asset_type
        ET.SubElement(apply_tags, "assetId").text = asset.id
        ET.SubElement(apply_tags, "tagKeyName").text = tag_key_name
        response = self.connection.request_with_orgId_api_2(
            "tag/removeTags", method="POST", data=ET.tostring(apply_tags)
        ).object
        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_list_tags(
        self,
        asset_id=None,
        asset_type=None,
        location=None,
        tag_key_name=None,
        tag_key_id=None,
        value=None,
        value_required=None,
        display_on_report=None,
    ):
        """
        List tags in the NTTC-CIS Cloud

        :param asset_id: Filter the list by asset id
        :type  asset_id: ``str``

        :param asset_type: Filter the list by asset type
        :type  asset_type: ``str``

        :param location: Filter the list by the assets location
        :type  location: :class:``NodeLocation`` or ``str``

        :param tag_key_name: Filter the list by a tag key name
        :type  tag_key_name: ``str``

        :param tag_key_id: Filter the list by a tag key id
        :type  tag_key_id: ``str``

        :param value: Filter the list by a tag value
        :type  value: ``str``

        :param value_required: Filter the list to if a value is required
                               for a tag
        :type  value_required: ``bool``

        :param display_on_report: Filter the list to if the tag should
                                  show up on usage reports
        :type  display_on_report: ``bool``

        :rtype: ``list`` of :class:`NttCisTag`
        """

        params = {}

        if asset_id is not None:
            params["assetId"] = asset_id

        if asset_type is not None:
            params["assetType"] = asset_type

        if location is not None:
            params["datacenterId"] = self._location_to_location_id(location)

        if tag_key_name is not None:
            params["tagKeyName"] = tag_key_name

        if tag_key_id is not None:
            params["tagKeyId"] = tag_key_id

        if value is not None:
            params["value"] = value

        if value_required is not None:
            params["valueRequired"] = str(value_required).lower()

        if display_on_report is not None:
            params["displayOnReport"] = str(display_on_report).lower()

        paged_result = self.connection.paginated_request_with_orgId_api_2(
            "tag/tag", method="GET", params=params
        )

        tags = []

        for result in paged_result:
            tags.extend(self._to_tags(result))

        return tags

    def ex_summary_usage_report(self, start_date, end_date):
        """
        Get summary usage information

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """

        result = self.connection.raw_request_with_orgId_api_1(
            "report/usage?startDate={}&endDate={}".format(start_date, end_date)
        )

        return self._format_csv(result.response)

    def ex_detailed_usage_report(self, start_date, end_date):
        """
        Get detailed usage information

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """

        result = self.connection.raw_request_with_orgId_api_1(
            "report/usageDetailed?startDate={}&endDate={}".format(start_date, end_date)
        )

        return self._format_csv(result.response)

    def ex_software_usage_report(self, start_date, end_date):
        """
        Get detailed software usage reports

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """

        result = self.connection.raw_request_with_orgId_api_1(
            "report/usageSoftwareUnits?startDate={}&endDate={}".format(start_date, end_date)
        )

        return self._format_csv(result.response)

    def ex_audit_log_report(self, start_date, end_date):
        """
        Get audit log report

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :rtype: ``list`` of ``list``
        """

        result = self.connection.raw_request_with_orgId_api_1(
            "auditlog?startDate={}&endDate={}".format(start_date, end_date)
        )

        return self._format_csv(result.response)

    def ex_backup_usage_report(self, start_date, end_date, location):
        """
        Get audit log report

        :param start_date: Start date for the report
        :type  start_date: ``str`` in format YYYY-MM-DD

        :param end_date: End date for the report
        :type  end_date: ``str`` in format YYYY-MM-DD

        :keyword location: Filters the node list to nodes that are
                           located in this location
        :type    location: :class:`NodeLocation` or ``str``

        :rtype: ``list`` of ``list``
        """

        datacenter_id = self._location_to_location_id(location)
        result = self.connection.raw_request_with_orgId_api_1(
            "backup/detailedUsageReport?datacenterId=%s&fromDate=%s&toDate=%s"
            % (datacenter_id, start_date, end_date)
        )

        return self._format_csv(result.response)

    def ex_list_ip_address_list(self, ex_network_domain):
        """
        List IP Address List by network domain ID specified

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> import libcloud.security
        >>>
        >>> # Get NTTC-CIS driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.NTTCIS)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # List IP Address List of network domain
        >>> ipaddresslist_list = driver.ex_list_ip_address_list(
        >>>     ex_network_domain=my_network_domain)
        >>> pprint(ipaddresslist_list)

        :param  ex_network_domain: The network domain or network domain ID
        :type   ex_network_domain: :class:`NttCisNetworkDomain` or 'str'

        :return: a list of NttCisIpAddressList objects
        :rtype: ``list`` of :class:`NttCisIpAddressList`
        """

        params = {"networkDomainId": self._network_domain_to_network_domain_id(ex_network_domain)}
        response = self.connection.request_with_orgId_api_2(
            "network/ipAddressList", params=params
        ).object

        return self._to_ip_address_lists(response)

    def ex_get_ip_address_list(self, ex_network_domain, ex_ip_address_list_name):
        """
        Get IP Address List by name in network domain specified

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> import libcloud.security
        >>>
        >>> # Get NTTC-CIS driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.NTTCIS)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # Get IP Address List by Name
        >>> ipaddresslist_list_by_name = driver.ex_get_ip_address_list(
        >>>     ex_network_domain=my_network_domain,
        >>>     ex_ip_address_list_name='My_IP_AddressList_1')
        >>> pprint(ipaddresslist_list_by_name)


        :param  ex_network_domain: (required) The network domain or network
                                   domain ID in which ipaddresslist resides.
        :type   ex_network_domain: :class:`NttCisNetworkDomain` or 'str'

        :param    ex_ip_address_list_name: (required) Get 'IP Address List' by
                                            name
        :type     ex_ip_address_list_name: :``str``

        :return: a list of NttCisIpAddressList objects
        :rtype: ``list`` of :class:`NttCisIpAddressList`
        """

        ip_address_lists = self.ex_list_ip_address_list(ex_network_domain)

        return list(filter(lambda x: x.name == ex_ip_address_list_name, ip_address_lists))

    def ex_create_ip_address_list(
        self,
        ex_network_domain,
        name,
        description,
        ip_version,
        ip_address_collection,
        child_ip_address_list=None,
    ):
        """
        Create IP Address List. IP Address list.

        >>> from pprint import pprint
        >>> from libcloud.compute.types import Provider
        >>> from libcloud.compute.providers import get_driver
        >>> from libcloud.common.nttcis import NttCisIpAddress
        >>> import libcloud.security
        >>>
        >>> # Get NTTC-CIS driver
        >>> libcloud.security.VERIFY_SSL_CERT = True
        >>> cls = get_driver(Provider.NTTCIS)
        >>> driver = cls('myusername','mypassword', region='dd-au')
        >>>
        >>> # Get location
        >>> location = driver.ex_get_location_by_id(id='AU9')
        >>>
        >>> # Get network domain by location
        >>> networkDomainName = "Baas QA"
        >>> network_domains = driver.ex_list_network_domains(location=location)
        >>> my_network_domain = [d for d in network_domains if d.name ==
                              networkDomainName][0]
        >>>
        >>> # IP Address collection
        >>> ipAddress_1 = NttCisIpAddress(begin='190.2.2.100')
        >>> ipAddress_2 = NttCisIpAddress(begin='190.2.2.106',
                                                 end='190.2.2.108')
        >>> ipAddress_3 = NttCisIpAddress(begin='190.2.2.0',
                                                 prefix_size='24')
        >>> ip_address_collection = [ipAddress_1, ipAddress_2, ipAddress_3]
        >>>
        >>> # Create IPAddressList
        >>> result = driver.ex_create_ip_address_list(
        >>>     ex_network_domain=my_network_domain,
        >>>     name='My_IP_AddressList_2',
        >>>     ip_version='IPV4',
        >>>     description='Test only',
        >>>     ip_address_collection=ip_address_collection,
        >>>     child_ip_address_list='08468e26-eeb3-4c3d-8ff2-5351fa6d8a04'
        >>> )
        >>>
        >>> pprint(result)


        :param  ex_network_domain: The network domain or network domain ID
        :type   ex_network_domain: :class:`NttCisNetworkDomain` or 'str'

        :param    name:  IP Address List Name (required)
        :type      name: :``str``

        :param    description:  IP Address List Description (optional)
        :type      description: :``str``

        :param    ip_version:  IP Version of ip address (required)
        :type      ip_version: :``str``

        :param    ip_address_collection:  List of IP Address. At least one
                                          ipAddress element or one
                                          childIpAddressListId element must
                                          be provided.
        :type      ip_address_collection: :``str``

        :param    child_ip_address_list:  Child IP Address List or id to be
                                          included in this IP Address List.
                                          At least one ipAddress or
                                          one childIpAddressListId
                                          must be provided.
        :type     child_ip_address_list:
                        :class:'NttCisChildIpAddressList` or `str``

        :return: a list of NttCisIpAddressList objects
        :rtype: ``list`` of :class:`NttCisIpAddressList`
        """

        if ip_address_collection is None and child_ip_address_list is None:
            raise ValueError(
                "At least one ipAddress element or one "
                "childIpAddressListId element must be "
                "provided."
            )

        create_ip_address_list = ET.Element("createIpAddressList", {"xmlns": TYPES_URN})
        ET.SubElement(create_ip_address_list, "networkDomainId").text = (
            self._network_domain_to_network_domain_id(ex_network_domain)
        )

        ET.SubElement(create_ip_address_list, "name").text = name

        ET.SubElement(create_ip_address_list, "description").text = description

        ET.SubElement(create_ip_address_list, "ipVersion").text = ip_version

        for ip in ip_address_collection:
            ip_address = ET.SubElement(
                create_ip_address_list,
                "ipAddress",
            )
            ip_address.set("begin", ip.begin)

            if ip.end:
                ip_address.set("end", ip.end)

            if ip.prefix_size:
                ip_address.set("prefixSize", ip.prefix_size)

        if child_ip_address_list is not None:
            ET.SubElement(create_ip_address_list, "childIpAddressListId").text = (
                self._child_ip_address_list_to_child_ip_address_list_id(child_ip_address_list)
            )

        response = self.connection.request_with_orgId_api_2(
            "network/createIpAddressList",
            method="POST",
            data=ET.tostring(create_ip_address_list),
        ).object

        response_code = findtext(response, "responseCode", TYPES_URN)

        return response_code in ["IN_PROGRESS", "OK"]

    def ex_edit_ip_address_list(
        self,
        ex_ip_address_list,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



