def get_block(self, net, blkname):
     if net is "":
         blk = generic_getters.get_entity_by_name(self.api._soap_client,
                                                  self.conf.get_id(),
                                                  blkname, "IP4Block")
         if blk.id != 0:
             return self.api.get_entity_by_id(blk.id)
         return 0
     else:
         blk = generic_getters.get_entity_by_name(self.api._soap_client,
                                                  self.conf.get_id(),
                                                  blkname, "IP4Block")
         if blk.id != 0:
             return self.api.get_entity_by_id(blk.id)
         return self.conf.add_ip4_block_by_cidr(net, "name=" + blkname)
 def get_network(self, blk, net, netname):
     netObj = generic_getters.get_entity_by_name(self.api._soap_client,
                                                 blk.get_id(), netname,
                                                 "IP4Network")
     if netObj.id != 0:
         return self.api.get_entity_by_id(netObj.id)
     else:
         if net is "":
             return 0
         else:
             return blk.add_ip4_network(net, "name=" + netname)
    def get_service_ip_for_server(self, servername):
        logger = self._identity["logger"]
        sip = 0
        sipitem = None
        server_tag = generic_getters.get_entity_by_name(
            self.api._soap_client, self.tagGroup, servername, "Tag")
        logger.debug("get_service_ip_for_server: " + servername +
                     ": found server tag: " + str(server_tag.id))
        if server_tag.id != 0:
            ip = self.api._soap_client.service.getLinkedEntities(
                server_tag.id, "IP4Address", 0, 1)
            for item in ip[0]:
                sipitem = item
                temp = item["properties"]
                sip = (temp.split('address=')[1]).split('|')[0]

        return sipitem, sip, server_tag.id
class bam:

    global _shared_state
    _shared_state = {}
    _shared_state["logger"] = None

    def __init__(self,
                 ip=None,
                 user="******",
                 password="******",
                 conf='zte',
                 logger=None):
        self._identity = _shared_state

        if "connstate" in self._identity and self._identity["connstate"] == 1:
            return
        else:
            if ip != None:
                self._identity["ip"] = ip
                self._identity["user"] = user
                self._identity["password"] = password
                self._identity["api_url"] = 'http://' + str(
                    ip) + '/Services/API?wsdl'
                self._identity["logger"] = logger
                self._identity["conf"] = conf
                self._identity["view"] = "recursive"
                self._identity["taggroup"] = "vBDDS"
                self._identity["connstate"] = 0
            else:
                if self._identity["ip"] == None:
                    return 0

    def get_block(self, net, blkname):
        if net is "":
            blk = generic_getters.get_entity_by_name(self.api._soap_client,
                                                     self.conf.get_id(),
                                                     blkname, "IP4Block")
            if blk.id != 0:
                return self.api.get_entity_by_id(blk.id)
            return 0
        else:
            blk = generic_getters.get_entity_by_name(self.api._soap_client,
                                                     self.conf.get_id(),
                                                     blkname, "IP4Block")
            if blk.id != 0:
                return self.api.get_entity_by_id(blk.id)
            return self.conf.add_ip4_block_by_cidr(net, "name=" + blkname)

    def get_network(self, blk, net, netname):
        netObj = generic_getters.get_entity_by_name(self.api._soap_client,
                                                    blk.get_id(), netname,
                                                    "IP4Network")
        if netObj.id != 0:
            return self.api.get_entity_by_id(netObj.id)
        else:
            if net is "":
                return 0
            else:
                return blk.add_ip4_network(net, "name=" + netname)

    def init_bam(self, params=None):
        user = self._identity["user"]
        password = self._identity["password"]
        conf = self._identity["conf"]
        logger = self._identity["logger"]
        viewname = self._identity["view"]
        taggroupname = self._identity["taggroup"]

        api_url = self._identity["api_url"]

        try:
            self.api = api(self._identity["api_url"])
        except URLError, e:
            logger.error("FAILED TO CONNECT TO BAM: " + api_url + "(" +
                         str(e.args) + ")")
            return 1

        try:
            self.api.login(user, password)
        except api_exception as e:
            logger.error("FAILED TO LOGIN TO BAM: " + api_url)
            return 1

        try:
            self.conf = self.api.get_configuration(conf)
        except api_exception as e:
            logger.error("FAILED TO ACCESS CONFIGURATION zte ON BAM")
            return 1

        self._identity["connstate"] = 1
        logger.debug(
            "SUCCESSFULY CONNECTED TO BAM and accessed configuration:" +
            self.conf.get_name())

        if params is not None and "service_net" in params:
            self.service_blk = self.get_block(params["service_net"],
                                              "Service Block")
        else:
            self.service_blk = self.get_block("", "Service Block")

        logger.debug("service blk is " + str(self.service_blk.get_id()))

        if params is not None and "mgmt_net" in params:
            self.mgmt_blk = self.get_block(params["mgmt_net"],
                                           "Management Block")
        else:
            self.mgmt_blk = self.get_block("", "Management Block")
        logger.debug("mgmt blk is " + str(self.mgmt_blk.get_id()))

        if params is not None and "service_net" in params:
            self.service_net = self.get_network(self.service_blk,
                                                params["service_net"],
                                                "Service Network")
        else:
            self.service_net = self.get_network(self.service_blk, "",
                                                "Service Network")
        logger.debug("service net is " + str(self.service_net.get_id()))

        if params is not None and "mgmt_net" in params:
            self.mgmt_net = self.get_network(self.mgmt_blk, params["mgmt_net"],
                                             "Management Network")
        else:
            self.mgmt_net = self.get_network(self.mgmt_blk, "",
                                             "Management Network")
        logger.debug("mgmt net is " + str(self.mgmt_net.get_id()))

        self.view = self.conf.get_view(viewname)
        if self.view.get_id() == 0:
            self.view = self.conf.add_view(viewname)
        logger.debug("view id is " + str(self.view.get_id()))

        tagGroup = generic_getters.get_entity_by_name(self.api._soap_client, 0,
                                                      taggroupname, "TagGroup")
        if tagGroup.id == 0:
            self.tagGroup = self.api._soap_client.service.addTagGroup(
                taggroupname, "")
        else:
            self.tagGroup = tagGroup.id

        logger.debug("taggroup id is " + str(self.tagGroup))
    def add_server(self, servername, service_ip):
        logger = self._identity["logger"]
        logger.debug("Called add server :" + servername)

        id = servername.split("-")[1]
        masklen = 24

        try:
            ip_obj = self.api.get_entity_by_id(id)
        except api_exception as e:
            logger.error(e)
            return

        ipaddress = ip_obj._properties['address']

        logger.debug("Got IP address : " + str(ipaddress) + " for server : " +
                     servername)

        try:
            server_obj = self.conf.get_server(servername)
        except api_exception as e:
            logger.error(e)
            return

        if service_ip == "":
            sipitem, sip, stag = self.get_service_ip_for_server(servername)
        else:
            sip = service_ip.split('/')[0]
            masklen = service_ip.split('/')[1]

        netmask = len_to_mask(masklen)

        # Start adding the server
        logger.debug("Starting timer to add server " + servername +
                     ' with management ip=' + str(ipaddress) +
                     ' and serviceip=' + str(sip) + "/" + str(netmask))
        if server_obj is None:
            retry = 0
            while retry < 100:
                try:
                    server_obj = self.conf.add_server(
                        servername, ipaddress, servername,
                        "password=bluecat|connected=true|servicesIPv4Address="
                        + str(sip) + "|servicesIPv4Netmask=" + str(netmask))
                    retry = 100
                except api_exception as e:
                    logger.debug(str(e))
                    server_obj = self.conf.get_server(servername)
                    if server_obj != None:
                        retry = 100
                    else:
                        retry = retry + 1
                        time.sleep(10)
                        if retry > 20:
                            retry = 100
                except socket.timeout:
                    logger.debug("Almost done in add_server..")

        # Deploy DNS
        server_intf = generic_getters.get_entity_by_name(
            self.api._soap_client, server_obj.get_id(), servername,
            "NetworkServerInterface")
        dnsdeploy = self.api._soap_client.service.getDNSDeploymentRole(
            self.view.get_id(), server_intf.id)
        if dnsdeploy.id == 0:
            dnsdeploy = self.api._soap_client.service.addDNSDeploymentRole(
                self.view.get_id(), server_intf.id, "RECURSION",
                "view=" + self.view.get_name())

        status = self.api._soap_client.service.getServerDeploymentStatus(
            server_obj.get_id(), "")
        if status in [3, 4, 5, 6, 7, 8]:
            self.api._soap_client.service.deployServer(server_obj.get_id())

        return server_obj