def _add_pod_to_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return
        vm = VirtualMachineKM.get(pod_id)
        if not vm:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for vmi_id in vm.virtual_machine_interfaces:
                vmi = VirtualMachineInterfaceKM.get(vmi_id)
                if not vmi:
                    continue

                for member_id in pool.members:
                    member = LoadbalancerMemberKM.get(member_id)
                    if member and member.vmi == vmi_id:
                        break
                else:
                    self.logger.debug(
                        "Creating LB member for Pod/VM: %s in LB: %s with "
                        "target-port: %d"
                        % (vm.fq_name, lb.name, port['port']))
                    member_obj = self._vnc_create_member(
                        pool, pod_id, vmi_id, port['port'])
                    LoadbalancerMemberKM.locate(member_obj.uuid)
Example #2
0
    def _remove_pod_from_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member and member.vm == pod_id:
                    self.logger.debug(
                        "Delete LB member for Pod/VM: %s from LB: %s" %
                        (pod_id, lb.name))

                    try:
                        vmi_obj = self._vnc_lib.virtual_machine_interface_read(
                            id=member.vmi)

                        # Remove service member label from vmi.
                        svc_member_label = self._labels.get_service_label(
                            lb.service_name)
                        for k, v in svc_member_label.items():
                            self._vnc_lib.unset_tag(vmi_obj, k)
                    except NoIdError:
                        # VMI has already been deleted. Nothing to unset/remove.
                        pass

                    self.service_lb_member_mgr.delete(member_id)
                    LoadbalancerMemberKM.delete(member.uuid)
                    break
Example #3
0
    def _vnc_delete_listeners(self, lb):
        listeners = lb.loadbalancer_listeners.copy()
        for ll_id in listeners or []:
            ll = LoadbalancerListenerKM.get(ll_id)
            if not ll:
                continue
            pool_id = ll.loadbalancer_pool
            if pool_id:
                pool = LoadbalancerPoolKM.get(pool_id)
                if pool:
                    members = pool.members.copy()
                    for member_id in members or []:
                        member = LoadbalancerMemberKM.get(member_id)
                        if member:
                            self.service_lb_member_mgr.delete(member_id)
                            self.logger.debug("Deleting LB member %s" %
                                              member.name)
                            LoadbalancerMemberKM.delete(member_id)

                self._vnc_delete_pool(pool_id)
                self.logger.debug("Deleting LB pool %s" % pool.name)
                LoadbalancerPoolKM.delete(pool_id)

            self.logger.debug("Deleting LB listener %s" % ll.name)
            self._vnc_delete_listener(ll_id)
            LoadbalancerListenerKM.delete(ll_id)
    def _add_pod_to_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return
        vm = VirtualMachineKM.get(pod_id)
        if not vm:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for vmi_id in vm.virtual_machine_interfaces:
                vmi = VirtualMachineInterfaceKM.get(vmi_id)
                if not vmi:
                    continue

                for member_id in pool.members:
                    member = LoadbalancerMemberKM.get(member_id)
                    if member and member.vmi == vmi_id:
                        break
                else:
                    self.logger.debug(
                        "Creating LB member for Pod/VM: %s in LB: %s with "
                        "target-port: %d" %
                        (vm.fq_name, lb.name, port['port']))
                    member_obj = self._vnc_create_member(
                        pool, pod_id, vmi_id, port['port'])
                    LoadbalancerMemberKM.locate(member_obj.uuid)
    def _add_pod_to_service(self, service_id, pod_id, port=None, address=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return
        vm = VirtualMachineKM.get(pod_id)
        host_vmi = None
        if not vm:
            if not self._args.host_network_service:
                return
            host_vmi = self._get_vmi_from_ip(address)
            if host_vmi == None:
                return
            else:
                vm = VirtualMachine(name="host", display_name="host")
                vm.virtual_machine_interfaces = [host_vmi]

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for vmi_id in vm.virtual_machine_interfaces:
                if host_vmi == None:
                    vmi = VirtualMachineInterfaceKM.get(vmi_id)
                else:
                    vmi = self._vnc_lib.virtual_machine_interface_read(
                        id=vmi_id)
                if not vmi:
                    continue

                for member_id in pool.members:
                    member = LoadbalancerMemberKM.get(member_id)
                    if member and member.vmi == vmi_id:
                        break
                else:
                    self.logger.debug(
                        "Creating LB member for Pod/VM: %s in LB: %s with "
                        "target-port: %d" %
                        (vm.fq_name, lb.name, port['port']))
                    member_obj = self._vnc_create_member(
                        pool, pod_id, vmi_id, port['port'])

                    try:
                        vmi_obj = self._vnc_lib.virtual_machine_interface_read(
                            id=vmi_id)
                    except:
                        raise

                    # Attach the service label to underlying pod vmi.
                    self._labels.append(
                        vmi_id,
                        self._labels.get_service_label(lb.service_name))
                    # Set tags on the vmi.
                    self._vnc_lib.set_tags(
                        vmi_obj, self._labels.get_labels_dict(vmi_id))

                    LoadbalancerMemberKM.locate(member_obj.uuid)
Example #6
0
 def _delete_listener(self, ll_id):
     ll = LoadbalancerListenerKM.get(ll_id)
     pool_id = ll.loadbalancer_pool
     if pool_id:
         pool = LoadbalancerPoolKM.get(pool_id)
         member_list = pool.members.copy()
         for member_id in member_list:
             self._vnc_delete_member(member_id)
             LoadbalancerMemberKM.delete(member_id)
         self._vnc_delete_pool(pool_id)
         LoadbalancerPoolKM.delete(pool_id)
     self._vnc_delete_listener(ll_id)
     LoadbalancerListenerKM.delete(ll_id)
Example #7
0
    def _get_pods_attached_to_service(self, service_id, port=None):
        """
        Get list of Pods attached to the Service for a given port.
        """
        pod_members = set()
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return pod_members

        # No listeners on LB. Error condition. Handle gracefully..
        if len(lb.loadbalancer_listeners) == 0:
            self.logger.warning("No listeners on LB ({})".format(lb.name))
            return pod_members

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member.vm:
                    pod_members.add(member.vm)

        return pod_members
    def _get_pods_attached_to_service(self, service_id, port=None):
        """
        Get list of Pods attached to the Service for a given port.
        """
        pod_members = set()
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return pod_members

        # No listeners on LB. Error condition. Handle gracefully..
        if len(lb.loadbalancer_listeners) == 0:
            self.logger.warning("No listeners on LB ({})".format(lb.name))
            return pod_members

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member.vm:
                    pod_members.add(member.vm)

        return pod_members
    def _remove_pod_from_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member and member.vm == pod_id:
                    self.logger.debug(
                        "Delete LB member for Pod/VM: %s from LB: %s"
                        % (pod_id, lb.name))
                    self.service_lb_member_mgr.delete(member_id)
                    LoadbalancerMemberKM.delete(member.uuid)
                    break
    def _remove_pod_from_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member and member.vm == pod_id:
                    self.logger.debug(
                        "Delete LB member for Pod/VM: %s from LB: %s" %
                        (pod_id, lb.name))
                    self.service_lb_member_mgr.delete(member_id)
                    LoadbalancerMemberKM.delete(member.uuid)
                    break
Example #11
0
 def _update_member(self, ns_name, backend_member, pool):
     resource_type = "service"
     member_id = backend_member['member_id']
     new_service_name = backend_member['serviceName']
     new_service_port = backend_member['servicePort']
     member = LoadbalancerMemberKM.get(member_id)
     annotations = member.annotations
     for kvp in annotations['key_value_pair'] or []:
         if kvp['key'] == 'serviceName':
             old_service_name = kvp['value']
             break
     old_service_port = member.params['protocol_port']
     service_ip = None
     if new_service_name != old_service_name:
         service_info = self._kube.get_resource(resource_type,
                                                new_service_name, ns_name)
         if service_info and 'clusterIP' in service_info['spec']:
             service_ip = service_info['spec']['clusterIP']
         else:
             self._logger.error("%s - clusterIP for Service %s Not Found" %
                                (self._name, new_service_name))
             self._logger.error(
                 "%s - (%s %s) Member Not Updated for Pool %s" %
                 (self._name, new_service_name, str(new_service_port),
                  pool.name))
             self._vnc_delete_member(member_id)
             LoadbalancerMemberKM.delete(member_id)
             self._logger.error("%s - (%s %s) Member Deleted for Pool %s" %
                                (self._name, old_service_name,
                                 str(old_service_port), pool.name))
             return None
     else:
         service_ip = member.params['address']
     annotations = {}
     annotations['serviceName'] = new_service_name
     self._vnc_update_member(member_id, service_ip, new_service_port,
                             annotations)
     member = LoadbalancerMemberKM.update(member)
     return member
Example #12
0
 def _create_member(self, ns_name, backend_member, pool):
     resource_type = "service"
     service_name = backend_member['serviceName']
     service_port = backend_member['servicePort']
     service_info = self._kube.get_resource(resource_type, service_name,
                                            ns_name)
     member = None
     if service_info and 'clusterIP' in service_info['spec']:
         service_ip = service_info['spec']['clusterIP']
         self._logger.debug("%s - clusterIP for service %s - %s" %
                            (self._name, service_name, service_ip))
         member_match = False
         annotations = {}
         annotations['serviceName'] = service_name
         for member_id in pool.members:
             member = LoadbalancerMemberKM.get(member_id)
             if member and member.params['address'] == service_ip \
                and member.params['protocol_port'] == service_port:
                 member_match = True
                 break
         if not member_match:
             member_obj = self._vnc_create_member(pool, service_ip,
                                                  service_port, annotations)
             if member_obj:
                 member = LoadbalancerMemberKM.locate(member_obj.uuid)
             else:
                 self._logger.error(
                     "%s - (%s %s) Member Not Created for Pool %s" %
                     (self._name, service_name, str(service_port),
                      pool.name))
     else:
         self._logger.error("%s - clusterIP for Service %s Not Found" %
                            (self._name, service_name))
         self._logger.error(
             "%s - (%s %s) Member Not Created for Pool %s" %
             (self._name, service_name, str(service_port), pool.name))
     return member
    def _remove_pod_from_service(self, service_id, pod_id, port=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for member_id in pool.members:
                member = LoadbalancerMemberKM.get(member_id)
                if member and member.vm == pod_id:
                    self.logger.debug(
                        "Delete LB member for Pod/VM: %s from LB: %s"
                        % (pod_id, lb.name))

                    try:
                        vmi_obj = self._vnc_lib.virtual_machine_interface_read(
                                      id = member.vmi)

                        # Remove service member label from vmi.
                        svc_member_label = self._labels.get_service_label(
                            lb.service_name)
                        for k,v in svc_member_label.iteritems():
                            self._vnc_lib.unset_tag(vmi_obj, k)

                    except NoIdError:
                        # VMI has already been deleted. Nothing to unset/remove.
                        pass
                    except:
                        raise

                    self.service_lb_member_mgr.delete(member_id)
                    LoadbalancerMemberKM.delete(member.uuid)
                    break
Example #14
0
    def _add_pod_to_service(self, service_id, pod_id, port=None, address=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return
        vm = VirtualMachineKM.get(pod_id)
        host_vmi = None
        if not vm:
            if not self._args.host_network_service:
                return
            host_vmi = self._get_vmi_from_ip(address)
            if host_vmi is None:
                return
            else:
                vm = VirtualMachine(name="host", display_name="host")
                vm.virtual_machine_interfaces = [host_vmi]

        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for vmi_id in vm.virtual_machine_interfaces:
                vmi = VirtualMachineInterfaceKM.get(vmi_id)
                if not vmi:
                    continue

                if host_vmi is None:
                    # Add VMI only if it matches the default address for endpoint,
                    # ignore other interfaces for pod
                    ip_found = False
                    for iip_uuid in vmi.instance_ips:
                        iip = InstanceIpKM.get(iip_uuid)
                        if iip and iip.address == address:
                            ip_found = True
                            break
                    if not ip_found:
                        continue

                for member_id in pool.members:
                    member = LoadbalancerMemberKM.get(member_id)
                    if member and member.vmi == vmi_id:
                        break
                else:
                    self.logger.debug(
                        "Creating LB member for Pod/VM: %s in LB: %s with "
                        "target-port: %d" %
                        (vm.fq_name, lb.name, port['port']))
                    member_obj = self._vnc_create_member(
                        pool, pod_id, vmi_id, port['port'])

                    vmi_obj = self._vnc_lib.virtual_machine_interface_read(
                        id=vmi_id)

                    # Attach the service label to underlying pod vmi.
                    self._labels.append(
                        vmi_id,
                        self._labels.get_service_label(lb.service_name))
                    # Set tags on the vmi.
                    self._vnc_lib.set_tags(
                        vmi_obj, self._labels.get_labels_dict(vmi_id))

                    LoadbalancerMemberKM.locate(member_obj.uuid)
    def _add_pod_to_service(self, service_id, pod_id, port=None, address=None):
        lb = LoadbalancerKM.get(service_id)
        if not lb:
            return
        vm = VirtualMachineKM.get(pod_id)
        host_vmi = None
        if not vm:
            if not self._args.host_network_service:
                return
            host_vmi = self._get_vmi_from_ip(address)
            if host_vmi == None:
                return
            else:
                vm = VirtualMachine(name="host", display_name="host")
                vm.virtual_machine_interfaces = [host_vmi]


        for lb_listener_id in lb.loadbalancer_listeners:
            pool = self._get_loadbalancer_pool(lb_listener_id, port)
            if not pool:
                continue

            for vmi_id in vm.virtual_machine_interfaces:
                if host_vmi == None:
                    vmi = VirtualMachineInterfaceKM.get(vmi_id)
                else:
                    vmi = self._vnc_lib.virtual_machine_interface_read(id=vmi_id)
                if not vmi:
                    continue

                # Add VMI only if it matches the default address for endpoint,
                # ignore other interfaces for pod
                ip_found = False
                for iip_uuid in vmi.instance_ips:
                    iip = InstanceIpKM.get(iip_uuid)
                    if iip and iip.address == address:
                        ip_found = True
                        break

                if ip_found == False:
                    continue

                for member_id in pool.members:
                    member = LoadbalancerMemberKM.get(member_id)
                    if member and member.vmi == vmi_id:
                        break
                else:
                    self.logger.debug(
                        "Creating LB member for Pod/VM: %s in LB: %s with "
                        "target-port: %d"
                        % (vm.fq_name, lb.name, port['port']))
                    member_obj = self._vnc_create_member(
                        pool, pod_id, vmi_id, port['port'])

                    try:
                        vmi_obj = self._vnc_lib.virtual_machine_interface_read(
                                      id = vmi_id)
                    except:
                        raise

                    # Attach the service label to underlying pod vmi.
                    self._labels.append(vmi_id,
                        self._labels.get_service_label(lb.service_name))
                    # Set tags on the vmi.
                    self._vnc_lib.set_tags(vmi_obj,
                        self._labels.get_labels_dict(vmi_id))

                    LoadbalancerMemberKM.locate(member_obj.uuid)
Example #16
0
 def _get_old_backend_list(self, lb):
     backend_list = []
     listener_list = lb.loadbalancer_listeners
     for ll_id in listener_list:
         backend = {}
         backend['listener_id'] = ll_id
         ll = LoadbalancerListenerKM.get(ll_id)
         backend['listener'] = {}
         backend['listener']['protocol'] = ll.params['protocol']
         if backend['listener']['protocol'] == 'TERMINTED_HTTPS':
             if ll.params['default_tls_container']:
                 backend['listener']['default_tls_container'] = \
                     ll.params['default_tls_container']
             if ll.params['sni_containers']:
                 backend['listener']['sni_containers'] = \
                     ll.params['sni_containers']
         pool_id = ll.loadbalancer_pool
         if pool_id:
             pool = LoadbalancerPoolKM.get(pool_id)
             if pool.annotations is None:
                 annotations = {}
                 kvps = []
                 pool_obj = self._vnc_lib.loadbalancer_pool_read(id=pool_id)
                 pool_obj_kvp = pool_obj.annotations.key_value_pair
                 kvps_len = len(pool_obj_kvp)
                 for count in range(0, kvps_len):
                     kvp = {}
                     kvp['key'] = pool_obj_kvp[count].key
                     kvp['value'] = pool_obj_kvp[count].value
                     kvps.append(kvp)
                 annotations['key_value_pair'] = kvps
             else:
                 annotations = pool.annotations
             backend['pool_id'] = pool_id
             backend['annotations'] = {}
             for kvp in annotations['key_value_pair'] or []:
                 key = kvp['key']
                 value = kvp['value']
                 backend['annotations'][key] = value
             backend['pool'] = {}
             backend['pool']['protocol'] = pool.params['protocol']
             backend['member'] = {}
             if len(pool.members) == 0:
                 continue
             member_id = list(pool.members)[0]
             member = LoadbalancerMemberKM.get(member_id)
             if member.annotations is None:
                 annotations = {}
                 kvps = []
                 member_obj = self._vnc_lib.loadbalancer_member_read(
                     id=member_id)
                 member_obj_kvp = member_obj.annotations.key_value_pair
                 kvps_len = len(member_obj_kvp)
                 for count in range(0, kvps_len):
                     kvp = {}
                     kvp['key'] = member_obj_kvp[count].key
                     kvp['value'] = member_obj_kvp[count].value
                     kvps.append(kvp)
                 annotations['key_value_pair'] = kvps
             else:
                 annotations = member.annotations
             backend['member_id'] = member_id
             protocol_port = member.params['protocol_port']
             for kvp in annotations['key_value_pair'] or []:
                 if kvp['key'] == 'serviceName':
                     backend['member']['serviceName'] = kvp['value']
                     backend['member']['servicePort'] = protocol_port
                     break
         backend_list.append(backend)
     return backend_list