def add_prefix(self, prefix, type, description): p = Prefix() p.prefix = prefix p.type = type p.description = description p.save() return p
def test_add_prefix(self): """ We should NOT be able to execute add_prefix as read-only user """ p = Prefix() p.prefix = '1.3.3.7' with self.assertRaises(NipapAuthorizationError): p.save()
def test_edit_prefix(self): """ We should NOT be able to execute edit_prefix as read-only user """ p = Prefix() p.id = 123 with self.assertRaises(NipapAuthorizationError): p.save()
def test_country_code_length(self): """ Make sure only two character country codes are allowed """ p = Prefix() p.prefix = '1.3.3.0/24' p.type = 'assignment' # try to input one character - should fail - this will be a INSERT operation p.country = 'a' with self.assertRaisesRegexp(NipapValueError, 'Please enter a two letter country code according to ISO 3166-1 alpha-2'): p.save() # try to input one character - should fail - this will be an UPDATE operation p.country = 'a' with self.assertRaisesRegexp(NipapValueError, 'Please enter a two letter country code according to ISO 3166-1 alpha-2'): p.save() # try to input three character - should fail p.country = 'aaa' with self.assertRaisesRegexp(NipapValueError, 'Please enter a two letter country code according to ISO 3166-1 alpha-2'): p.save() # try to input a number character - should fail p.country = 'a1' with self.assertRaisesRegexp(NipapValueError, 'Please enter a two letter country code according to ISO 3166-1 alpha-2'): p.save() # try to input two character - should succeed p.country = 'se' p.save() # output should be capitalized self.assertEqual('SE', p.country)
def save_hosts(): for host in hosts: try: host.save() continue except: pass r = Prefix().search({"operator": "contains", "val1": "prefix", "val2": host.prefix}) for p in r["result"]: try: p.type = "assignment" p.tags["guessed"] = 1 p.save() except: pass try: host.save() continue except: pass # this is a last and probably wrong attempt # to fix the bad data in infoblox. p = Prefix() p.type = "assignment" p.description = "AUTO: host container (import)" p.tags["auto"] = 1 ip = ipaddr.IPNetwork(host.prefix) p.prefix = str(ip.supernet(prefixlen_diff=1).network) + "/127" p.save() host.save()
def add_prefix_to_vrf(self, vrfrt, prefix, type, description, status, tags=[]): """ Note: This function adds a prefix to a given VRF, if the prefix is used or invalid, it will return None :param vrfrt: String like "209:123" :param prefix: String like "1.0.0.0/29" :param type: String, must be on of the following: 'reservation', 'assignment', 'host' :param description: String :param status: String, must be "assigned" or "reserved" :param tags: Array of Strings :return: Prefix object or None """ myvrf = None p = None # get the vrf myvrf = self.find_vrf('rt', vrfrt) p = Prefix() p.prefix = prefix p.type = type p.status = status p.description = description p.vrf = myvrf p.tags = tags try: p.save() except: e = sys.exc_info()[0] logging.error("Error: could not add prefix: %s" % e) return p
def freeprefix(nipap_deamon_ip, account_cb_alias, account_iam_alias, vpc_network, vpc_prefix): # Lookup nipap daemon password cipher nipapCfn = dynamodb.Table(os.environ['TAILOR_TABLENAME_NIPAPCFN']) getNipapCfn = nipapCfn.get_item( Key={ 'nipapAlias': account_cb_alias } ) # Decrypt nipap daemon password nipapDaemonPasswordCipherBlob = getNipapCfn['Item']['nipapDaemonPasswordCipherBlob'] nipapDeamonPassword = bytes(kms.decrypt(CiphertextBlob=b64decode(nipapDaemonPasswordCipherBlob))['Plaintext']) # Look up free CIDR block pynipap.xmlrpc_uri = "http://*****:*****@" + nipap_deamon_ip + ":1337" a = pynipap.AuthOptions({ 'authoritative_source': 'tailor_nipap_client' }) # Allocate first available new_prefix = Prefix() new_prefix.description = account_iam_alias new_prefix.type = "assignment" # Save will communicate with the backend and ask for the next available desired prefix size new_prefix.save({'from-prefix': [vpc_network], 'prefix_length': vpc_prefix}) # Read the assigned prefix from the new_prefix object print("VPC Cidr is: ", new_prefix.prefix) return new_prefix.prefix
def add_prefix_from_pool(self, pool, family, description): p = Prefix() args = {} args['from-pool'] = pool args['family'] = family p.type = pool.default_type p.save(args) return p
def add_prefix(self, prefix, type, description, tags=None): if tags is None: tags = [] p = Prefix() p.prefix = prefix p.type = type p.description = description p.tags = tags p.save() return p
def add_prefix(self, prefix, type, description, tags=[], pool_id=None): p = Prefix() p.prefix = prefix p.type = type p.description = description p.tags = tags if pool_id: pool = Pool.get(pool_id) p.pool = pool p.save() return p
def add_prefix_from_pool(self, pool, family, description): p = Prefix() args = {} args['from-pool'] = pool args['family'] = family p.type = pool.default_type p.status = 'assigned' try: p.save(args) return p except NipapError as exc: print("Error: could not add prefix: %s" % str(exc)) return None
def add_prefix(arg, opts): """ Add prefix to NIPAP """ s = get_schema() p = Prefix() p.schema = s p.prefix = opts.get('prefix') p.type = opts.get('type') p.description = opts.get('description') p.node = opts.get('node') p.country = opts.get('country') p.order_id = opts.get('order_id') p.vrf = opts.get('vrf') p.alarm_priority = opts.get('alarm_priority') p.comment = opts.get('comment') p.monitor = _str_to_bool(opts.get('monitor')) args = {} if 'from-pool' in opts: res = Pool.list(s, { 'name': opts['from-pool'] }) if len(res) == 0: print >> sys.stderr, "No pool named %s found." % opts['from-pool'] sys.exit(1) args['from-pool'] = res[0] if 'from-prefix' in opts: args['from-prefix'] = [ opts['from-prefix'], ] if 'prefix-length' in opts: args['prefix_length'] = int(opts['prefix-length']) if 'family' in opts: family = opts['family'] if opts['family'] == 'ipv4': family = 4 elif opts['family'] == 'ipv6': family = 6 args['family'] = family try: p.save(args) except NipapError, e: print >> sys.stderr, "Could not add prefix to NIPAP: %s" % e.message sys.exit(1)
def save_hosts(): for host in hosts: try: host.save() continue except: pass r = Prefix().search({ 'operator': 'contains', 'val1': 'prefix', 'val2': host.prefix }) for p in r['result']: try: p.type = 'assignment' p.tags['guessed'] = 1 p.save() except: pass try: host.save() continue except: pass # this is a last and probably wrong attempt # to fix the bad data in infoblox. p = Prefix() p.type = 'assignment' p.description = 'AUTO: host container (import)' p.tags['auto'] = 1 ip = ipaddr.IPNetwork(host.prefix) p.prefix = str(ip.supernet(prefixlen_diff=1).network) + '/127' p.save() host.save()
def parse_line(self, line): """ Parse one line """ try: # text params, ie params from the text file tp = self.split_columns(line) except CommentLine: # just ignore comments return if tp['prefix_type'] == 'reservation': # reservations / aggregates print "Reservation:", tp['prefix'], tp['description'] p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'reservation' p.description = tp['description'] p.monitor = True p.alarm_priority = 'low' p.authoritative_source = 'nw' p.save({}) return elif tp['node'] == '.' and tp['description'] == '.': # ignore prefixes without description or node set return elif tp['prefix_length'] == 32: # loopback # if it's a loopback, the covering prefix will be a reservation and we can just insert an assignment. # if this insert fails, it means the parent prefix is an assignment and we instead insert a host try: p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] # loopbacks are always of type 'assignment' p.type = 'assignment' p.node = tp['node'] p.description = tp['description'] p.monitor = True p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' p.save({}) print "Loopback:", tp['prefix'] return except: p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] # loopbacks are always of type 'assignment' p.type = 'host' p.node = tp['node'] p.description = tp['description'] p.monitor = True p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' p.save({}) print "Host:", tp['prefix'] return elif tp['prefix_length'] == 30 or tp['prefix_length'] == 31: # link network octets = tp['address'].split('.') prefix_node1 = None prefix_node2 = None if tp['prefix_length'] == 30: prefix_node1 = '.'.join(octets[:3] + [str( int(octets[3]) + 1 )] ) + '/32' prefix_node2 = '.'.join(octets[:3] + [str( int(octets[3]) + 2 )] ) + '/32' else: prefix_node1 = '.'.join(octets) + '/32' prefix_node2 = '.'.join(octets[:3] + [str( int(octets[3]) + 1 )] ) + '/32' #m = re.match('(ETHER_KAP|ETHER_PORT|IP-KAP|IP-PORT|IP-SIPNET|IP-SNIX|IPSUR|L2L|RED-IPPORT|SNIX|SWIP|T2V-@|T2V-DIGTV|T2V-SUR)[0-9]{4,}', tp['order_id']) m = re.match('.*[0-9]{6}$', tp['order_id']) if m is not None or tp['type'] == 'CUSTOMER': print "Customer link", tp['prefix'], ':', tp['description'] p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'assignment' p.description = tp['description'] p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' if tp['order_id'] != '.': p.order_id = tp['order_id'] p.save({}) # insert node1 and node2 p1 = Prefix() p1.schema = self.schema p1.prefix = prefix_node1 p1.type = 'host' p1.description = 'Some PE router' p1.authoritative_source = 'nw' p1.save({}) p2 = Prefix() p2.schema = self.schema p2.prefix = prefix_node2 p2.type = 'host' p2.node = tp['node'] p2.description = 'CPE' p2.authoritative_source = 'nw' p2.save({}) return m = re.match(r'([^\s]+)\s*<->\s*([^\s]+)', tp['description']) if m is not None: node1 = m.group(1) node2 = m.group(2) print "Link network: ", tp['prefix'], " ", node1, "<->", node2 p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'assignment' p.description = node1 + ' <-> ' + node2 p.monitor = True p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' p.save({}) # insert node1 and node2 p1 = Prefix() p1.schema = self.schema p1.prefix = prefix_node1 p1.type = 'host' p1.node = node1 p1.description = node1 p1.authoritative_source = 'nw' p1.save({}) p2 = Prefix() p2.schema = self.schema p2.prefix = prefix_node2 p2.type = 'host' p2.node = node2 p2.description = node2 p2.authoritative_source = 'nw' p2.save({}) return m = re.match('(DN)[0-9]{4,}', tp['order_id']) if m is not None: print "Internal order link network", tp['prefix'], ':', tp['description'] p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'assignment' p.description = tp['description'] p.monitor = True p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' p.save({}) return print "Other link network", tp['prefix'], ':', tp['description'] p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'assignment' p.description = tp['description'] p.monitor = True p.alarm_priority = tp['alarm_priority'] p.authoritative_source = 'nw' p.save({}) return else: try: p = Prefix() p.schema = self.schema p.prefix = tp['prefix'] p.type = 'assignment' p.description = tp['description'] p.monitor = True p.alarm_priority = 'low' p.authoritative_source = 'nw' p.save({}) print "Other:", tp['prefix'] except NipapValueError, e: print tp['prefix'], ':', e sys.exit(1) return
def run_task(self): a = AuthOptions({'authoritative_source': 'yapt'}) pynipap.xmlrpc_uri = "http://{0}:{1}@{2}:{3}/XMLRPC".format( self.grp_cfg.TASKS.Provision.Ipam.User, self.grp_cfg.TASKS.Provision.Ipam.Password, self.grp_cfg.TASKS.Provision.Ipam.Address, self.grp_cfg.TASKS.Provision.Ipam.Port) for prefix in self.grp_cfg.TASKS.Provision.Ipam.Prefixes: try: p = Prefix.find_free(None, { 'from-prefix': [prefix], 'prefix_length': 32 }) except socket.error as se: self.update_task_state( new_task_state=c.TASK_STATE_FAILED, task_state_message=logmsg.IPAM_CONN_ERR.format( se.strerror)) Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device, message=logmsg.IPAM_CONN_ERR.format( se.strerror)) return except NipapAuthenticationError as nae: self.update_task_state( new_task_state=c.TASK_STATE_FAILED, task_state_message=logmsg.IPAM_CONN_ERR.format( nae.message)) Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device, message=logmsg.IPAM_CONN_ERR.format( nae.message)) return if p: self.shared[c.TASK_SHARED_IPAM].append(p) new_prefix = Prefix() new_prefix.prefix = p[0] new_prefix.type = 'host' new_prefix.description = self.sample_device.deviceSerial try: new_prefix.save() self.update_task_state( new_task_state=c.TASK_STATE_DONE, task_state_message=c.TASK_STATE_MSG_DONE) Tools.emit_log( task_name=self.task_name, task_state={ 'taskState': self.task_state, 'taskStateMsg': c.TASK_STATE_MSG_DONE }, sample_device=self.sample_device, grp_cfg=self.grp_cfg, shared=self.shared, scope=c.LOGGER_SCOPE_ALL, level=c.LOGGER_LEVEL_INFO, message=logmsg.IPAM_PREFIX_OK.format(prefix)) except NipapValueError as nve: self.update_task_state( new_task_state=c.TASK_STATE_FAILED, task_state_message=logmsg.IPAM_PREFIX_ERR.format( nve.message)) Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device, message=logmsg.IPAM_PREFIX_ERR.format( nve.message)) else: self.update_task_state( new_task_state=c.TASK_STATE_FAILED, task_state_message=logmsg.IPAM_PREFIX_FULL.format(prefix)) Tools.emit_log(task_name=self.task_name, sample_device=self.sample_device, message=logmsg.IPAM_PREFIX_FULL.format(prefix))