def _get_netscaler_service_from_node(self, loadBalancerId, loadBalancer, nodeId, node):

        service_obj = {}
     

        for key in node:
 
            self.logger.debug("Examining key \"%s\" of node object" % key)

            if key == "_properties":
                continue

            if key == "id":
                service_obj["name"] = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)
                continue

            if key == "address":
                service_obj["ip"] = node.address
                continue 
            
            if key == "port":
                service_obj["port"] = node.port
                continue                


        if loadBalancer:
            servicetype = NitroUtils.get_servicetype_from_protocol(loadBalancer.protocol)
            servicetype = NitroUtils.get_decrypted_version_of_servicetype(servicetype)
            service_obj["servicetype"] = servicetype 


        return service_obj
    def _get_netscaler_updatenode_protocol_task(self, loadBalancerId,
                                                loadBalancer, node,
                                                newLoadBalancerId):

        servicename = NitroUtils.get_servicename_from_nodeid(
            loadBalancerId, node.id)

        if not "protocol" in loadBalancer:
            return None

        lbprotocol = loadBalancer.protocol

        servicetype = NitroUtils.get_servicetype_from_protocol(lbprotocol)
        servicetype = NitroUtils.get_decrypted_version_of_servicetype(
            servicetype)

        service = {}
        service["name"] = servicename
        service["protocol"] = servicetype

        task = {}
        task["name"] = servicename
        task["type"] = "service"
        task["operation"] = "UPDATE"
        task["state"] = service

        return task
    def get_netscaler_addnodes_tasks(self, loadBalancerId, loadBalancer, nodes, existing_ids=[]):


        """ 
        Preconditions: 
                  A. The lbvserver object must have the following attributes
                     for this method to work:
                         1. name 
                         2. service_type

                  B. The lb_algorithm must contain a non empty value
        """
                        

        total_nodes = len(existing_ids) + len(nodes)

        self.logger.debug("existing node ids are: %s" % str(existing_ids))

        if total_nodes > MAX_NODES_PER_LOADBALANCER:
            raise OverLimitException("Number of nodes exceeds maximum of %s allowed per load balancer" % MAX_NODES_PER_LOADBALANCER)
 
        task_list = []

        for node in nodes:

            if not "id" in node:
                operation = "ADD"
                nodeid = NitroUtils.generate_nodeid(existing_ids)
                existing_ids.append(nodeid) 
                node.id = str(nodeid)

            else:
                operation = "UPDATE"

            task = self._get_netscaler_addservice_task(loadBalancerId, loadBalancer, node.id, node)
            task["operation"] = operation
            task_list.append(task)    
              
            task = self.get_netscaler_addservicebinding_task(loadBalancerId, loadBalancer, node.id, node)
            task_list.append(task)

            service_name = NitroUtils.get_servicename_from_nodeid(loadBalancerId, node.id)

            if operation == "ADD": 
                task = self._get_netscaler_addservicestatus_task(loadBalancerId, loadBalancer, node.id, node)
                task = self._get_netscaler_addmonitorbinding_task(loadBalancerId, loadBalancer, node)

            if operation == "UPDATE":
                task = self._get_netscaler_updateservicestatus_task(loadBalancerId, loadBalancer, node.id, node)

            if task:
                task_list.append(task) 
        

        return task_list  
    def _get_netscaler_removeservice_task(self, loadBalancerId, loadBalancer, nodeId):
                 
        servicename = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)
                                                                                          
        task = {}
        task["type"] = "service"
        task["name"] = servicename
        task["operation"] = "REMOVE"
        task["state"] = None

        return task
    def _get_netscaler_node_currentcondition(self, loadBalancerId, loadBalancer, nodeId):

        service_name = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)

        service = self.nitrowrapper.get_netscaler_entity("service", service_name)

        svrstate = service["svrstate"]

        current_condition = NitroUtils.get_condition_from_svrstate(svrstate)

        return current_condition
    def _get_netscaler_monitorbinding_from_healthmonitor(
            self, loadBalancerId, node, healthMonitor):

        monitor_name = NitroUtils.get_monitorname_from_loadBalancerId(
            loadBalancerId)
        service_name = NitroUtils.get_servicename_from_nodeid(
            loadBalancerId, node.id)

        monitor_binding = {}
        monitor_binding["monitorname"] = monitor_name
        monitor_binding["servicename"] = service_name

        return monitor_binding
    def get_netscaler_removeservicebinding_task(self, loadBalancerId, loadBalancer, nodeId):

        lbvserver_name = NitroUtils.get_lbvservername_from_loadbalancerid(loadBalancerId)
        servicename = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)

        args = "servicename:" +  servicename
        args += ","
        args += "name:" + lbvserver_name

        task = {}
        task["type"] = "lbvserver_service_binding"
        task["name"] = lbvserver_name + "?args=" + args
        task["operation"] = "REMOVE"
        task["state"] = None

        return task
    def get_netscaler_removemonitorbinding_task(self, loadBalancerId,
                                                loadBalancer, nodeId):

        monitor_name = NitroUtils.get_monitorname_from_loadBalancerId(
            loadBalancerId)
        servicename = NitroUtils.get_servicename_from_nodeid(
            loadBalancerId, nodeId)

        args = "servicename:" + servicename

        task = {}
        task["type"] = "lbmonitor_service_binding"
        task["name"] = monitor_name + "?args=" + args
        task["operation"] = "REMOVE"
        task["state"] = None

        return task
    def _get_netscaler_getservicebinding_task(self, loadBalancerId, loadBalancer, nodeId):

        self.logger.debug("loadBalancer Id is: %s" % loadBalancerId)
        self.logger.debug("node Id is: %s" % nodeId)

        lbvserver_name = NitroUtils.get_lbvservername_from_loadbalancerid(loadBalancerId) 
        service_name = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)

        args = "servicename:" + service_name
                                                                                                        
        task = {}

        task["type"] = "lbvserver_service_binding"
        task["name"] = lbvserver_name + "?filter=" + args
        task["operation"] = "GET"
        task["state"] = None

        return task
    def _get_netscaler_servicebinding_from_node(self, loadBalancerId, loadBalancer, nodeId, node):

        service_binding_obj = {}

        lbvserver_name = NitroUtils.get_lbvservername_from_loadbalancerid(loadBalancerId)
        service_name =  NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)

        service_binding_obj["name"] = lbvserver_name
        service_binding_obj["servicename"] = service_name


        if "weight" in node and node.weight != 1 :
            if not loadBalancer.algorithm.startswith("WEIGHTED_"):
                raise BadRequestException("validation fault", "invalid object", 
                                          "LB algorithm in use doesn't allow for weighted nodes")

            service_binding_obj["weight"] = node["weight"]

        return service_binding_obj
    def _get_netscaler_addservicestatus_task(self, loadBalancerId, loadBalancer, nodeId, node):

        if not "condition" in node:
            return None

        service_name = NitroUtils.get_servicename_from_nodeid(loadBalancerId, nodeId)

        service = {}
        service["name"] = service_name

        task = {}
        task["type"] = "service"
        task["name"] = service_name
        task["state"] = service

        if node.condition == "ENABLED":
            task["operation"] = "ENABLE"
        else:
            task["operation"] = "DISABLE" 

        return task