示例#1
0
    def modify_cluster(self, cluster_data):
        try:
            cluster_id = cluster_data.get('id', None)
            if not cluster_id:
                raise Exception("No cluster id specified")
            self.check_obj("cluster", {"id": cluster_id})
            db_cluster = self.get_cluster({"id": cluster_id}, detail=True)
            if not db_cluster:
                msg = "%s is not valid" % cluster_id
                raise ServerMgrException(msg)
            db_cluster_params_str = db_cluster[0]['parameters']
            db_cluster_params = {}
            if db_cluster_params_str:
                db_cluster_params = eval(db_cluster_params_str)
            if 'uuid' not in db_cluster_params:
                str_uuid = str(uuid.uuid4())
                cluster_data["parameters"].update({"uuid": str_uuid})
            # Store cluster_params dictionary as a text field
            cluster_params = cluster_data.pop("parameters", {})
            for k, v in cluster_params.iteritems():
                if v == '""':
                    v = ''
                db_cluster_params[k] = v
            cluster_params = db_cluster_params
            if cluster_params is not None:
                cluster_data['parameters'] = str(cluster_params)

            # Store email list as text field
            email = cluster_data.pop("email", None)
            if email is not None:
                cluster_data['email'] = str(email)
            self._modify_row(cluster_table, cluster_data, {'id': cluster_id},
                             {})
        except Exception as e:
            raise e
示例#2
0
 def modify_image(self, image_data):
     try:
         image_id = image_data.get('id', None)
         if not image_id:
             raise Exception("No image id specified")
         #Reject if non mutable field changes
         db_image = self.get_image({'id': image_data['id']}, detail=True)
         if image_data['path'] != db_image[0]['path']:
             raise ServerMgrException('Image path cannnot be modified')
         if image_data['type'] != db_image[0]['type']:
             raise ServerMgrException('Image type cannnot be modified')
         # Store image_params dictionary as a text field
         image_parameters = image_data.pop("parameters", None)
         if image_parameters is not None:
             image_data['parameters'] = str(image_parameters)
         self._modify_row(image_table, image_data, {'id': image_id}, {})
     except Exception as e:
         raise e
示例#3
0
 def delete_cluster(self, match_dict=None, unmatch_dict=None):
     try:
         self.check_obj("cluster", match_dict, unmatch_dict)
         cluster_id = match_dict.get("id", None)
         servers = None
         if cluster_id:
             servers = self.get_server({'cluster_id': cluster_id},
                                       detail=True)
         if servers:
             msg = ("Servers are present in this cluster, "
                    "remove cluster association, prior to cluster delete.")
             raise ServerMgrException(msg)
         self._delete_row(cluster_table, match_dict, unmatch_dict)
     except Exception as e:
         raise e
    def storage_get_control_network_mask(self, provision_params,
        server, cluster):
        role_ips_dict = provision_params['roles']
        cluster_params = cluster.get('parameters', {})
        server_params = server.get('parameters', {})
        #openstack_ip = cluster_params.get("internal_vip", None)
        cluster_openstack_prov_params = (
            cluster_params.get("provision", {})).get("openstack", {})
        configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
        openstack_ip = ''
        self_ip = server.get("ip_address", "")
        if configured_external_keystone_ip:
            openstack_ip = configured_external_keystone_ip
        elif self_ip in role_ips_dict['openstack']:
            openstack_ip = self_ip
        elif 'openstack' in role_ips_dict:
            openstack_ip = role_ips_dict['openstack'][0]
        else:
            msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n " \
                  "The cluster needs to point to at least one Openstack node.\n"
            self._smgr_log.log(self._smgr_log.ERROR, msg)
            raise ServerMgrException(msg, ERR_OPR_ERROR)

        subnet_mask = server.get("subnet_mask", "")
        if not subnet_mask:
            subnet_mask = cluster_params.get("subnet_mask", "255.255.255.0")
        subnet_address = ""
        intf_control = {}
        subnet_address = str(IPNetwork(
            openstack_ip + "/" + subnet_mask).network)

        if openstack_ip == configured_external_keystone_ip:
            return '"' + str(IPNetwork(subnet_address).network) + '/' + str(IPNetwork(subnet_address).prefixlen) + '"'

        self._smgr_log.log(self._smgr_log.DEBUG, "control-net : %s" % str( provision_params['control_net']))
        if provision_params['control_net'] [openstack_ip]:
            intf_control = eval(provision_params['control_net'] [openstack_ip])
            self._smgr_log.log(self._smgr_log.DEBUG, "openstack-control-net : %s" % str(intf_control ))

        for intf,values in intf_control.items():
            if intf:
                self._smgr_log.log(self._smgr_log.DEBUG, "ip_address : %s" % values['ip_address'])
                return '"' + str(IPNetwork(values['ip_address']).network) + '/'+ str(IPNetwork(values['ip_address']).prefixlen) + '"'
            else:
                self._smgr_log.log(self._smgr_log.DEBUG, "server_ip : %s" % values['server_ip'])
                return '"' + str(IPNetwork(provision_params['server_ip']).network) + '/'+ str(IPNetwork(provision_params['server_ip']).prefixlen) + '"'

        return '"' + str(IPNetwork(subnet_address).network) + '/'+ str(IPNetwork(subnet_address).prefixlen) + '"'
示例#5
0
    def check_obj(self,
                  type,
                  match_dict=None,
                  unmatch_dict=None,
                  raise_exception=True):
        if type == "server":
            cb = self.get_server
            db_obj = cb(match_dict, unmatch_dict, detail=False)
        elif type == "cluster":
            cb = self.get_cluster
            db_obj = cb(match_dict, unmatch_dict, detail=False)
        elif type == "image":
            cb = self.get_image
            db_obj = cb(match_dict, unmatch_dict, detail=False)

        if not db_obj:
            msg = "%s not found" % (type)
            if raise_exception:
                raise ServerMgrException(msg)
            return False
        return True
 def log_and_raise_exception(self, msg, err_code=ERR_OPR_ERROR):
     self._smgr_log.log(self._smgr_log.ERROR, msg)
     raise ServerMgrException(msg, err_code)
示例#7
0
    def modify_server(self, server_data):
        db_server = None
        if 'id' in server_data.keys():
            db_server = self.get_server({'id': server_data['id']}, detail=True)
        elif 'mac_address' in server_data.keys():
            db_server = self.get_server(
                {'mac_address': server_data['mac_address']}, detail=True)
        try:
            cluster_id = server_data.get('cluster_id', None)
            if cluster_id:
                self.check_obj("cluster", {"id": cluster_id})

            if 'mac_address' in server_data:
                server_data['mac_address'] = str(
                    EUI(server_data['mac_address'])).replace("-", ":")
            server_mac = server_data.get('mac_address', None)
            if not server_mac:
                server_id = server_data.get('id', None)
                if not server_id:
                    raise Exception("No server MAC or id specified")
                else:
                    server_mac = self.get_server_mac(server_id)
            #Check if object exists
            if 'id' in server_data.keys() and \
                    'server_mac' in server_data.keys():
                self.check_obj('server', {'id': server_data['id']})
                #Reject if primary key values change
                if server_data['mac_address'] != db_server[0]['mac_address']:
                    raise ServerMgrException('MAC address cannnot be modified')

            # Store roles list as a text field
            roles = server_data.pop("roles", None)
            if roles is not None:
                server_data['roles'] = str(roles)
            intf_control = server_data.pop("control_data_network", None)
            if intf_control:
                server_data['intf_control'] = str(intf_control)
            intf_bond = server_data.pop("bond_interface", None)
            if intf_bond:
                server_data['intf_bond'] = str(intf_bond)
            # store tags if any
            server_tags = server_data.pop("tag", None)
            if server_tags is not None:
                tags_dict = self.get_server_tags(detail=True)
                rev_tags_dict = dict((v, k) for k, v in tags_dict.iteritems())
                for k, v in server_tags.iteritems():
                    server_data[rev_tags_dict[k]] = v
            # Store server_params dictionary as a text field
            server_params = server_data.pop("parameters", None)
            #if server_params is not None:
            #    server_data['server_params'] = str(server_params)
            #check for modify in db server_params
            #Always Update DB server parmas
            db_server_params = {}
            db_server_params_str = db_server[0]['parameters']
            if db_server_params_str:
                db_server_params = eval(db_server_params_str)
                if server_params:
                    for k, v in server_params.iteritems():
                        if v == '""':
                            v = ''
                        db_server_params[k] = v
            server_data['parameters'] = str(db_server_params)

            # Store email list as text field
            email = server_data.pop("email", None)
            if email is not None:
                server_data['email'] = str(email)
            self._modify_row(server_table, server_data,
                             {'mac_address': server_mac}, {})
        except Exception as e:
            raise e
示例#8
0
    def sandesh_init(self, sm_args, mon_config_set, inv_config_set):
        # Inventory node module initialization part
        try:
            module = None
            port = None
            module_list = None
            self._smgr_log.log(self._smgr_log.INFO, "Initializing sandesh")
            collectors_ip_list = eval(sm_args.collectors)
            if collectors_ip_list:
                self._smgr_log.log(
                    self._smgr_log.INFO,
                    "Collector IPs from config: " + str(collectors_ip_list))
                monitoring = True
                inventory = True

                if mon_config_set and inv_config_set:
                    try:
                        __import__('contrail_sm_monitoring.monitoring')
                    except ImportError:
                        mon_config_set = False
                        pass
                    try:
                        __import__('inventory_daemon.server_inventory')
                    except ImportError:
                        inv_config_set = False
                        pass
                    module = Module.INVENTORY_AGENT
                    port = int(sm_args.http_introspect_port)
                    module_list = [
                        'inventory_daemon.server_inventory',
                        'contrail_sm_monitoring.monitoring'
                    ]
                elif inv_config_set:
                    try:
                        __import__('inventory_daemon.server_inventory')
                    except ImportError:
                        inv_config_set = False
                        pass
                    module = Module.INVENTORY_AGENT
                    port = int(sm_args.http_introspect_port)
                    module_list = ['inventory_daemon.server_inventory']
                elif mon_config_set:
                    try:
                        __import__('contrail_sm_monitoring.monitoring')
                    except ImportError:
                        mon_config_set = False
                        pass
                    module = Module.IPMI_STATS_MGR
                    port = int(sm_args.http_introspect_port)
                    module_list = ['contrail_sm_monitoring.monitoring']
                if mon_config_set or inv_config_set:
                    module_name = ModuleNames[module]
                    node_type = Module2NodeType[module]
                    node_type_name = NodeTypeNames[node_type]
                    instance_id = INSTANCE_ID_DEFAULT
                    sandesh_global.init_generator(module_name,
                                                  socket.gethostname(),
                                                  node_type_name, instance_id,
                                                  collectors_ip_list,
                                                  module_name, port,
                                                  module_list)
                    sandesh_global.set_logging_params(
                        level=sm_args.sandesh_log_level)
                else:
                    self._smgr_log.log(self._smgr_log.INFO,
                                       "Sandesh wasn't initialized")
            else:
                pass
        except Exception as e:
            raise ServerMgrException("Error during Sandesh Init: " + str(e))
    def build_openstack_hiera_file(
        self, hiera_filename, provision_params,
        server, cluster, cluster_servers):
        cluster_params = cluster.get('parameters', {})
        server_params = server.get('parameters', {})
        # Get all values needed to fill the template.
        self_ip = server.get("ip_address", "")

        openstack_ips = [x["ip_address"] for x in cluster_servers if "openstack" in eval(x.get('roles', '[]'))]
        cluster_openstack_prov_params = (cluster_params.get("provision", {})).get("openstack", {})
        configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
        if configured_external_keystone_ip:
            openstack_ip = configured_external_keystone_ip
        elif self_ip in openstack_ips:
            openstack_ip = self_ip
        elif len(openstack_ips):
            openstack_ip = openstack_ips[0]
        else:
            msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n " \
                   "The cluster needs to point to at least one Openstack node.\n"
            self._smgr_log.log(self._smgr_log.ERROR, msg)
            raise ServerMgrException(msg, ERR_OPR_ERROR)
        
        subnet_mask = server.get("subnet_mask", "")
        if not subnet_mask:
            subnet_mask = cluster_params.get("subnet_mask", "255.255.255.0")

        new_provision_params = cluster_params.get("provision", {})
        openstack_params = new_provision_params.get("openstack", {})
        if new_provision_params:
            mysql_root_password = openstack_params.get("mysql", {}).get("root_password", "")
            mysql_service_password = openstack_params.get("mysql", {}).get("service_password", "")
            keystone_admin_password = openstack_params.get("keystone", {}).get("admin_password", "")
            #Re-generate adming token if nothing was specified
            #while creation.
            #Ideally auto-generate woudl have created it.
            #But old SM-code didn't
            keystone_admin_token = openstack_params.get("keystone", {}).get("admin_token", self.random_string(12))
            heat_encryption_key = openstack_params.get("heat",{}).get("encryption_key", "")
            mysql_allowed_hosts = openstack_params.get("mysql_allowed_hosts", [])
            if not mysql_allowed_hosts:
                calc_cluster_params = cluster.get("calc_params", {})
                mysql_allowed_hosts = calc_cluster_params.get("mysql_allowed_hosts", [])
            # end if
        else:
            mysql_root_password = cluster_params.get("mysql_root_password", "")
            mysql_service_password = cluster_params.get("mysql_service_password", "")
            keystone_admin_password = cluster_params.get("keystone_password", "")
            #Re-generate adming token if nothing was specified
            #while creation.
            #Ideally auto-generate woudl have created it.
            #But old SM-code didn't
            keystone_admin_token = cluster_params.get("keystone_admin_token", self.random_string(12))
            heat_encryption_key = cluster_params.get("heat_encryption_key", "")
            # Calculate list of hosts with mysql access granted.
            mysql_allowed_hosts = []
            internal_vip = cluster_params.get("internal_vip", None)
            if internal_vip:
                mysql_allowed_hosts.append(internal_vip) 
            external_vip = cluster_params.get("external_vip", None)
            if external_vip:
                mysql_allowed_hosts.append(external_vip) 
            contrail_internal_vip = cluster_params.get("contrail_internal_vip", None)
            if contrail_internal_vip:
                mysql_allowed_hosts.append(contrail_internal_vip) 
            contrail_external_vip = cluster_params.get("contrail_external_vip", None)
            if contrail_external_vip:
                mysql_allowed_hosts.append(contrail_external_vip) 
            os_ip_list =  [self.get_control_ip(provision_params, x["ip_address"].encode('ascii')) \
                    for x in cluster_servers if 'openstack' in set(eval(x['roles']))]
            config_ip_list =  [self.get_control_ip(provision_params, x["ip_address"].encode('ascii')) \
                    for x in cluster_servers if 'config' in set(eval(x['roles']))]
            role_ips_dict = provision_params['roles']
            mysql_allowed_hosts = list(
               set(mysql_allowed_hosts + os_ip_list + config_ip_list + role_ips_dict['config'] + role_ips_dict['openstack'] ))
        # end else openstack_params
        template_vals = {
            '__openstack_ip__': openstack_ip,
            '__subnet_mask__': subnet_mask,
            '__mysql_root_password__': mysql_root_password,
            '__mysql_service_password__': mysql_service_password,
            '__keystone_admin_token__': keystone_admin_token,
            '__keystone_admin_password__': keystone_admin_password,
            '__mysql_allowed_hosts__': (', '.join("'" + item + "'" for item in mysql_allowed_hosts)),
            '__openstack_password__': keystone_admin_password,
            '__heat_encryption_key__': heat_encryption_key
        }
        data = openstack_hieradata.template.safe_substitute(template_vals)
        outfile = open(hiera_filename, 'w')
        outfile.write(data)
        outfile.close()
    def add_cluster_parameters(self, cluster_params):
        cluster_params_mapping = {
            "uuid" : ["uuid", "string"],
            "internal_vip" : ["internal_vip", "string"],
            "external_vip" : ["external_vip", "string"],
            "contrail_internal_vip" : ["contrail_internal_vip", "string"],
            "contrail_external_vip" : ["contrail_external_vip", "string"],
            "internal_virtual_router_id" : ["internal_virtual_router_id", "integer"],
            "external_virtual_router_id" : ["external_virtual_router_id", "integer"],
            "contrail_internal_virtual_router_id" : ["contrail_internal_virtual_router_id", "integer"],
            "contrail_external_virtual_router_id" : ["contrail_external_virtual_router_id", "integer"],
            "analytics_data_ttl" : ["analytics_data_ttl", "integer"],
            "analytics_config_audit_ttl" : ["analytics_config_audit_ttl", "integer"],
            "analytics_statistics_ttl" : ["analytics_statistics_ttl", "integer"],
            "analytics_flow_ttl" : ["analytics_flow_ttl", "integer"],
            "snmp_scan_frequency" : ["snmp_scan_frequency", "integer"],
            "snmp_fast_scan_frequency" : ["snmp_fast_scan_frequency", "integer"],
            "topology_scan_frequency" : ["topology_scan_frequency", "integer"],
            "analytics_syslog_port" : ["analytics_syslog_port", "integer"],
            "database_dir" : ["database_dir", "string"],
            "analytics_data_dir" : ["analytics_data_dir", "string"],
            "ssd_data_dir" : ["ssd_data_dir", "string"],
            "database_minimum_diskGB" : ["database_minimum_diskGB", "integer"],
            "enable_lbass" : ["enable_lbass", "boolean"],
            "redis_password" : ["redis_password", "string"],
            "keystone_ip" : ["keystone_ip", "string"],
            "keystone_password" : ["keystone_admin_password", "string"],
            "keystone_username" : ["keystone_admin_user", "string"],
            "keystone_tenant" : ["keystone_admin_tenant", "string"],
            "keystone_service_tenant" : ["keystone_service_tenant", "string"],
            "keystone_region_name" : ["keystone_region_name", "string"],
            "multi_tenancy" : ["multi_tenancy", "boolean"],
            "zookeeper_ip_list" : ["zookeeper_ip_list", "array"],
            "haproxy" : ["haproxy_flag", "string"],
            "hc_interval" : ["hc_interval", "integer"],
            "nfs_server" : ["nfs_server", "string"],
            "nfs_glance_path" : ["nfs_glance_path", "string"],
            "database_token" : ["database_initial_token", "integer"],
            "encapsulation_priority" : ["encap_priority", "string"],
            "router_asn" : ["router_asn", "string"],
            "external_bgp" : ["external_bgp", "string"],
            "use_certificates" : ["use_certs", "boolean"],
            "contrail_logoutput" : ["contrail_logoutput", "boolean"],
            "enable_ceilometer": ["enable_ceilometer", "boolean"],
            "xmpp_dns_auth_enable": ["xmpp_dns_auth_enable", "boolean"],
            "xmpp_auth_enable": ["xmpp_auth_enable", "boolean"],
            "contrail_amqp_ip_list": ["contrail_amqp_ip_list", "array"],
            "contrail_amqp_port": ["contrail_amqp_port", "integer"],
            "openstack_amqp_ip_list": ["openstack_amqp_ip_list", "array"],
            "openstack_amqp_port": ["openstack_amqp_port", "integer"]
        }

        data = ''
        try:
            # Go thru all the keys above and if present, add to parameter list
            for k,v in cluster_params_mapping.items():
                if k in cluster_params:
                    # if value is text, add with quotes, else without the quotes.
                    if v[1].lower() == "string":
                        data += 'contrail::params::' + v[0] + ': "' + \
                            cluster_params.get(k, "") + '"\n'
                    else:
                        data += 'contrail::params::' + v[0] + ': ' + \
                            cluster_params.get(k, "") + '\n'
                    # end if-else
            # end for
            return data
        except Exception as e:
            msg = "%s, %s, %s:%s" % (repr(e), v, k, cluster_params.get(k))
            self._smgr_log.log(self._smgr_log.ERROR, msg)
            raise ServerMgrException(msg, ERR_OPR_ERROR)