mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
This PR contains 3 features - IPv4 Static Routing (Routed mode) #9346 Design document: https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=306153967 - AS Numbers Management #9410 Design Document: https://cwiki.apache.org/confluence/display/CLOUDSTACK/BGP+AS+Numbers+Management - Dynamic routing Design Document: https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=315492858 - Document: https://github.com/apache/cloudstack-documentation/pull/419 Rename nsx mode to routing mode by ``` git grep -l nsx_mode |xargs sed -i "s/nsx_mode/routing_mode/g" git grep -l nsxmode |xargs sed -i "s/nsxmode/routingmode/g" git grep -l nsxMode |xargs sed -i "s/nsxMode/routingMode/g" git grep -l NsxMode |xargs sed -i "s/NsxMode/RoutingMode/g" ``` - re-organize sql changes - fix NPE as rules do not have public ip - fix missing destination cidr in ingress rules - disable network usage for routed network - fix DB exception as network_id is -1 during network creation - apply ingress/egress routing rules - VR changes to configure nft rules for isolated network - VR: setup nft rule for control network - VR: flush all iptables rules - fix NPE which is because ingress rules do not have public ip associated - fix dest cidr is missing in nft tables - add ip4 routing and ip4 routes to list network and list vpc response - fix ingress rule is missing when vr is restarted - fix icmp types in nft rules - add tab to manage routing firewall rules - fix ingress rules are not applied when VR is restarted - add default rules in FORWARD chain - fix create vpc offerings - fix public ip is not assigned to vpc - fix network offering is not listed when create vpc tier - add is_routing to boot args of vpc vr - remove table ip4_firewall in vpc vr - release or remove subnet when remove a network - implemenent fw_vpcrouter_routing - fix wrong ip familty when flush ipv4 rules - fix acl rules are not applied due to wrong version (should be 6 which means ip6 rules are removed) - add default rules for vpc tiers so that tcp connections (e.g. ssh) work - append policy rules after default rules - remove /usr/local/cloud/systemvm/ in routers - throw an exception when allocate subnet with cidrsize - fix some TODOs - add new parameters to update API - return type Ipv4GuestSubnetNetworkMap when get or create subnet - fix firewall rules are broken - add domain_id and account_id to db - add domain/account/project to ipv4 subnet response - create ipv4 subnet for domain/account/project - check conflict when update ipv4 subnet - ui changes - add parent subnet to response - add list for ipv4 subnet - implement some methods - fix list subnets for guest networks by zoneid - UI changes - fix delete ipv4 subnet for network - fix ipv4 subnet is set to zone guest network cidr if cidrsize is specified - add zone info to response if parent subnet is null but network is not - fix gateway/cidr is not set when create network with cidrsize - fix order of nft rules in the VRs * Routed v24 - add classes in marvin base.py * Routed v25 - add test_01_subnet_zone - fix dedicate to domain/account failure - list subnets for network by keyword and subnet * Routed v26: implement subnet auto-allocation - add utils for split ip ranges into small subnets - add utils to get start/end ip of a cidr - implement subnet auto-generation - add global settings * Routed 27: add subnet for VPC - add db column for vpc_id - add db record for vpc - remove db record when delete a vpc - add checkConflicts methods - remove duplicated settings - check ipv4 cidr when create subnet * Routed v28: update smoke tests - update test_ipv4_routing.py - search subnets by networkid * Routed 29: fix vpc and add more tests - fix createnetwork in vpc - add vpc id/name to response - fix zone id/name are not displayed in some cases - add smoke test for vpc - add smoke tests for failed cases - add smoke test for connectivity checks - marvin: add "-q" to ssh command * Routed 31: ui and smoke tests - UI: add link to network in list view - add nftables rules check in VRs * Routed 32: add chain OUTPUT and more rules - fix the issue 80/443/8080 is not reachable from VR itself ``` 2024-06-27 10:21:52,121 INFO Executing: systemctl start cloud-password-server@172.31.1.1 2024-06-27 10:21:52,128 INFO Service cloud-password-server@172.31.1.1 start 2024-06-27 10:21:52,129 INFO Executing: ps aux 2024-06-27 10:24:02,175 ERROR Failed to update password server due to: <urlopen error [Errno 110] Connection timed out> ``` * Routed: fix dns search from VMs in Isolated networks * Routed: fix VPC dns issue due to gateway IP is missing in cloud.conf This is caused by NSX integration, and fixed by https://github.com/apache/cloudstack/pull/9102/ * Routed: rename routing_mode to network_mode * Routed: replace centos5.5 template in smoke test as dhclient does not work in the vms // this does not work refer to https://dominikrys.com/posts/disable-udp-checksum-validation/#ignoring-udp-checksums-with-nftables and https://forum.openwrt.org/t/udp-checksum-with-nftables/161522/11 the vm should have checksum offloading disabled * Routed: fix smoke test due to wrong cidrlist of egress rules and missing ingress rule from VR * PR 9346: fix lint error schema-41910to42000.sql * PR 9346: ui polish v1 * PR 9346: create VPC with cidrsize * Routed: fix test failures with test_network_ipv6 and test_vpc_ipv6 due to 'ssh -q' * Routed: fix /usr/local/cloud/systemvm/ are removed after SSVM/CPVM reboot * Routed: fix IP of additional nics of VPC VR is not gateway * PR 9346: fix cidrsize check when create VPC with cidrsize * Routed: fix test/integration/smoke/test_ipv4_routing.py:279:16: E713 test for membership should be 'not in' * PR9346: fix/Update api * PR 9346: set response object name * PR9346: UI refactor and small fixes * PR9346: change return type of getNetworkMode * PR9346: move IPv4 subnet to seperated tab * PR9346: revert IpRangesTabGuest.vue back to original * PR9346: fix remove ipv4 subnet on UI * PR9346: fix test_ipv4_routing.py * AS Number Range Management * Create AS Number Range for a Zone * Fix build * Add ListASNRange and fix create ASN range * Add List AS numbers * Add UI for AS Numbers * Fix UI and filter AS Numbers * Add AS Number on Isolated network creation and refactor UI and response * Release AS Number * Add network offering new columns * Add UI support to view and add AS number and configure network offering * Automatically assign AS Number if not specify AS number * update variable name * Fix routing mode check * UI: Only allow selecting AS number when routing mode is Dynamic and specifyAsNumber is true * UI: Only pass AS number when supported by the network offering * Release AS number on network deletion * Add deleteASNRange command (#81) * API: List ASNumbers by asnumber (#83) --------- Co-authored-by: Pearl Dsilva <pearl1594@gmail.com> * AS number management extensions * Support AS number on VPC tier creation based on the offering * Fix delete AS Range * Fix UI values * UI: Minor fix for releasing AS number * UI: Move management of AS Range to Zone details view * Fix specify_as_number column in network_offering table to set the default false * Add events for AS number operations * Allow users to list AS Numbers and fix network form for Normal users * Add AS number details to list networks response * Fix Allocated time format * Fix Allocated time format * support in details view too * Fix: Do not release AS number if acquired network requires AS number * Fix: Do not release AS number if acquired network requires AS number * Fix typo * Fix allocated release * Fix event type * UI: Add Routing mode and Specify AS to the network offering details * UI: Add Routing mode and Specify AS to the network offering details * Address comment * Fix release AS number of network deletion * Fix release AS number of network deletion * Fix * Restore release to its place based on the boolean * Rename boolean * API: Add networkId as listASNumber parameter * Add Network name to the search view filter for AS numbers * Present allocated time in human readable format - Pubilc IP / AS Numbers * Add account / domain filter for AS numbers * Add support for AS numbers on VPC offerings * Refactor AS number allocation to VPC and non VPC isolated networks * Checkstyle * Add support for AS numbers on VPC offerings * extend vpc offering view and vpcoffering response * merge https://github.com/shapeblue/cloudstack-playtika/pull/115 and change network_id of as_numbers to include vpc_id * Display AS number of VPC tiers as the AS number of the VPC * extend asnumber response and ui support * improve UI and as number response to view VPC details * List only dynamic offerings for vpc tiers with specify as numbers * Fix release AS number * Fix AS number displayed as 0 when no AS number assigned * Fix VPC offering creation without specify AS --------- Co-authored-by: nvazquez <nicovazquez90@gmail.com> * Fix release AS number on VPC deletion * Update server/src/main/java/com/cloud/dc/BGPServiceImpl.java * Update server/src/main/java/com/cloud/dc/BGPServiceImpl.java * Fix missing column on asnumber table * Fix listASNumbers API to support vpcid and obtain AS number from vpc for tiers * Prevent listing 0 AS number for VPC * Fix create Isolated Network form * Update server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java * Update server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java * Dynamic: move routingmode/specifyasn after networkmode in AddNetworkOffering.vue on UI * Dynamic: fix ip4routing in network response * Dynamic/systemvm: add FRR to systemvm template * Dynamic: BGP peers (DB,VO,Dao) * Dynamic: BGP peers (VR/server) * Dynamic: v3 - remove BgpPeer class - fix vpc vr has bgp peers of only 1 tier - rename ip4_cidr to guest_ip4_cidr - rename ip6_cidr to guest_ip6_cidr - generate /etc/frr/frr.conf - apply BGP peers on Dynamic-Routed network even if there is no BGP peers * Dynamic v4: fix vpc vr - fix duplicated guest cidr in frr.conf in vpc vr todo - restart frr / reload frr (reload will cause bgp session to Policy state) - apis for bgp peers - assign/release bgp peer from/to network * Dynamic v5: add apis for bgp peers * Dynamic v6: fix bugs - set response object name - remove required as number when update - fix checks when update - allow regular users to list bgp peers * Dynamic v7: move apis to bgp sub-dir * Dynamic v8: add tab for manage BGP peers on UI * Dynamic v9: fix update bgp with same config * Dynamiv v10: add changeBgpPeersForNetworkCmd * Dynamic v11: create network with bgppeerids - create network with bgppeerids - add marvin classes - add smoke tests - remove uuid from bgp_peer_network_map - fix created/removed in bgp_peer_network_map - remove bgppeers when remove a network - UI: fix delete bgp peer * Dynamic v12: add test for vpc tiers * Dynamic v13: bug fixes - fix change BGP peers for network in Allocated state - fix listing network returns removed record - fix all vpc tiers have the same settings - remove BGP peers as part of network removal - remove FRR settings for vpc tiers without any BGP peers - UI: fix no error msg when change BGP peers * Dynamic v14: assign BGP Peers for VPC instead of VPC tiers - create vpc with bgppeerids - do not allow create/update vpc tier with bgppeerids - apply all bgp peers when create/delete a vpc tier - UI: change bgp peers for vpc - test: update tests on vpc * Dynamic: fix build errors after merging as number PR * Dynamic: fix TODOs * Dynamic: fix smoke test on VPC * Allow creation of networks by users with as numbers * Address review comments * Move BGPService to bgp package and inject it on BaseCmd * Revert changes for CKS and address more comments * Display left side menu option for AS number only for root admin * Dynamic: create/update BGP peer with details refer to https://docs.frrouting.org/en/latest/bgp.html * Dynamic: fix build error and remove access to ListBgpPeers cmd for regular users * Dynamic: assign all zone BGP peers to user networks * Dynamic: show BGP peer info of networks only for root admin * AS number: disable specifyasnumber for non-NSX offerings * Dynamic: pass bgppeer details to command and fix typo with ip6 addr * Dynamic: list BGP peers by isdedicated, and fix change bgppeers for network/vpc * Dynamic: add UI labels * Dynamic: add bgp peers to vpc response * Dynamic: list bgp peers by keyword, fix list by asnumber * Dynamic: fix list bgppeers by keyword and db schema * Dynamic: fix list bgppeers do not return dedicated peers * Dynamic: update UI when create network/vpc offering * Update server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * Update tools/marvin/setup.py * Dynamic: network mode must be same when update a network with new offering * Dynamic: add method networkModel.isAnyServiceSupportedInNetwork * Dynamic: rename APIs and classes * Dynamic: fix unit tests due to previous changes * Dynamic: validateNetworkCidrSize when auto-create subnet * Dynamic: check AS number overlap * Dynamic: add ActionEvent * Dynamic: small code optimization * Dynamic: fix ui bugs after api rename * Dynamic: add marvin and test for ASN ranges and AS numbers * Dynamic: add account setting use.system.bgp.peers also - change the default value of routed.ipv4.vpc.max.cidr.size and routed.ipv4.vpc.min.cidr.size - change the category of settings * static: fix ui error when delete zone ipv4 subnets * static: small UI polish * Dynamic: throw exception when as number is required but not passed * Dynamic: fix typo when create FRR directory which causes network deletion failures * Dynamic: connect to ALL (or ALL dedicated) BGP peers if no BGP peer mapping for the network/vpc * Dynamic: throw exception when as number is required for VPC but not passed * Dynamic: list bgp peers by useSystemBgpPeers * Dynamic: fix frr config in VPC VR when change bgp peers * Dynamic: create frr config even if there is no VPC tiers * Dynamic: list bgp peers by zoneid (required for account) and account * Dynamic: only apply FRR config for vpc tiers with dynamic routing * Dynamic: donot send commands to router if commands size is 0 * Dynamic: fix 'new IPv6 address is not valid' when update bgp peer without IPv6 * Dynamic: throw exception if fail to allocate AS number when create network/vpc with dynamic routing * Dynamic: enable ipv6 unicast and 'ip nht resolve-via-default' * Dynamic: delete network/vpc if fail to allocate AS number when create network/vpc with dynamic routing * test: add unit tests for ASN APIs * test: add unit tests for core module * test: add unit tests for API responses * test: add unit tests for BgpPeerTO * test: add minor changes * test: add tests for create/delete/update/list RoutingFirewallRuleCmd * Static: show ip4 routes for vpc tiers * test: fix smoke test failure caused by type change of as number * test: add test for Ipv4SubnetForZoneCmd * test: add test for Ipv4SubnetForGuestNetworkCmd and BgpPeerCmd * UI: do not show redundant router when network mode is ROUTED as RVR is not supported * UI: hide 'Conserve mode' when networkmode is ROUTED * test: add unit tests for ListASNumbersCmdTest * Static: remove allocated IPv4 subnet when delete a network or vpc * test: add unit tests for BgpPeersRules * Dynamic: set ipv4routing from network offering * server: list as numbers and ipv4 subnets by keyword * server: remove dedicated bgp peers and ipv4 subnets when delete an account or domain * server: fix dedicated ipv4 subnet is allocated to other accounts * UI: fix allocated time format * server: ignore project is projectid is -1 so bgppeers/ipv4subnets works in project view * UI: add project column to bgp peers and ipv4 subnets * server: fix list AS numbers by domain admin or normal user * server: fix network creation when ipv4 subnet is dedicated * UI: polish network.js * Dynamic: fix frr config for ipv6 routing * Static routing: support cks cluster * Static: get/create IPv4 subnet from dedicated subnets at first * Dynamic: add BGP peers tab * Static: remove redundant loops * api: add since to api and response * server: add unit tests --------- Co-authored-by: Nicolas Vazquez <nicovazquez90@gmail.com> Co-authored-by: Pearl Dsilva <pearl1594@gmail.com> Co-authored-by: Harikrishna Patnala <harikrishna.patnala@gmail.com> Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com> Co-authored-by: Rohit Yadav <rohit.yadav@shapeblue.com>
341 lines
12 KiB
Python
Executable File
341 lines
12 KiB
Python
Executable File
#!/usr/bin/python
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import json
|
|
import os
|
|
import uuid
|
|
import logging
|
|
import gzip
|
|
import shutil
|
|
import cs_ip
|
|
import cs_guestnetwork
|
|
import cs_cmdline
|
|
import cs_vmp
|
|
import cs_network_acl
|
|
import cs_firewallrules
|
|
import cs_loadbalancer
|
|
import cs_monitorservice
|
|
import cs_vmdata
|
|
import cs_dhcp
|
|
import cs_forwardingrules
|
|
import cs_site2sitevpn
|
|
import cs_remoteaccessvpn
|
|
import cs_vpnusers
|
|
import cs_staticroutes
|
|
import cs_bgppeers
|
|
|
|
|
|
class DataBag:
|
|
|
|
DPATH = "/etc/cloudstack"
|
|
|
|
def __init__(self):
|
|
self.bdata = {}
|
|
|
|
def load(self):
|
|
data = self.bdata
|
|
if not os.path.exists(self.DPATH):
|
|
os.makedirs(self.DPATH)
|
|
self.fpath = os.path.join(self.DPATH, self.key + '.json')
|
|
|
|
try:
|
|
with open(self.fpath, 'r') as _fh:
|
|
logging.debug("Loading data bag type %s", self.key)
|
|
data = json.load(_fh)
|
|
except (IOError, ValueError):
|
|
logging.debug("Caught load error, creating empty data bag type %s", self.key)
|
|
data.update({"id": self.key})
|
|
finally:
|
|
self.dbag = data
|
|
|
|
def save(self, dbag):
|
|
try:
|
|
with open(self.fpath, 'w') as _fh:
|
|
logging.debug("Writing data bag type %s", self.key)
|
|
json.dump(
|
|
dbag, _fh,
|
|
sort_keys=True,
|
|
indent=2
|
|
)
|
|
except IOError:
|
|
logging.error("Could not write data bag %s", self.key)
|
|
|
|
def getDataBag(self):
|
|
return self.dbag
|
|
|
|
def setKey(self, key):
|
|
self.key = key
|
|
|
|
|
|
class updateDataBag:
|
|
|
|
DPATH = "/etc/cloudstack"
|
|
|
|
def __init__(self, qFile):
|
|
self.qFile = qFile
|
|
self.fpath = ''
|
|
self.bdata = {}
|
|
self.process()
|
|
|
|
def process(self):
|
|
self.db = DataBag()
|
|
if (self.qFile.type == "staticnatrules" or self.qFile.type == "forwardrules"):
|
|
self.db.setKey("forwardingrules")
|
|
else:
|
|
self.db.setKey(self.qFile.type)
|
|
dbag = self.db.load()
|
|
logging.info("Command of type %s received", self.qFile.type)
|
|
|
|
if self.qFile.type == 'ips':
|
|
dbag = self.processIP(self.db.getDataBag())
|
|
elif self.qFile.type == 'guestnetwork':
|
|
dbag = self.processGuestNetwork(self.db.getDataBag())
|
|
elif self.qFile.type == 'cmdline':
|
|
dbag = self.processCL(self.db.getDataBag())
|
|
elif self.qFile.type == 'vmpassword':
|
|
dbag = self.processVMpassword(self.db.getDataBag())
|
|
elif self.qFile.type == 'networkacl':
|
|
dbag = self.process_network_acl(self.db.getDataBag())
|
|
elif self.qFile.type == 'firewallrules':
|
|
dbag = self.process_firewallrules(self.db.getDataBag())
|
|
elif self.qFile.type == 'ipv6firewallrules':
|
|
dbag = self.process_ipv6firewallrules(self.db.getDataBag())
|
|
elif self.qFile.type == 'loadbalancer':
|
|
dbag = self.process_loadbalancer(self.db.getDataBag())
|
|
elif self.qFile.type == 'monitorservice':
|
|
dbag = self.process_monitorservice(self.db.getDataBag())
|
|
elif self.qFile.type == 'vmdata':
|
|
dbag = self.processVmData(self.db.getDataBag())
|
|
elif self.qFile.type == 'dhcpentry':
|
|
dbag = self.process_dhcp_entry(self.db.getDataBag())
|
|
elif self.qFile.type == 'staticnatrules' or self.qFile.type == 'forwardrules':
|
|
dbag = self.processForwardingRules(self.db.getDataBag())
|
|
elif self.qFile.type == 'site2sitevpn':
|
|
dbag = self.process_site2sitevpn(self.db.getDataBag())
|
|
elif self.qFile.type == 'remoteaccessvpn':
|
|
dbag = self.process_remoteaccessvpn(self.db.getDataBag())
|
|
elif self.qFile.type == 'vpnuserlist':
|
|
dbag = self.process_vpnusers(self.db.getDataBag())
|
|
elif self.qFile.type == 'staticroutes':
|
|
dbag = self.process_staticroutes(self.db.getDataBag())
|
|
elif self.qFile.type == 'bgppeers':
|
|
dbag = self.process_bgppeers(self.db.getDataBag())
|
|
elif self.qFile.type == 'ipaliases':
|
|
self.db.setKey('ips')
|
|
self.db.load()
|
|
dbag = self.process_ipaliases(self.db.getDataBag())
|
|
elif self.qFile.type == 'dhcpconfig':
|
|
logging.error("I don't think I need %s anymore", self.qFile.type)
|
|
return
|
|
else:
|
|
logging.error("Error I do not know what to do with file of type %s", self.qFile.type)
|
|
return
|
|
self.db.save(dbag)
|
|
|
|
def processGuestNetwork(self, dbag):
|
|
d = self.qFile.data
|
|
dp = {}
|
|
dp['public_ip'] = d['router_guest_ip']
|
|
dp['netmask'] = d['router_guest_netmask']
|
|
dp['source_nat'] = False
|
|
dp['add'] = d['add']
|
|
dp['one_to_one_nat'] = False
|
|
dp['gateway'] = d['router_guest_gateway']
|
|
dp['nic_dev_id'] = d['device'][3:]
|
|
dp['nw_type'] = 'guest'
|
|
dp['mtu'] = str(d['mtu'])
|
|
qf = QueueFile()
|
|
qf.load({'ip_address': [dp], 'type': 'ips'})
|
|
if 'domain_name' not in list(d.keys()) or d['domain_name'] == '':
|
|
d['domain_name'] = "cloudnine.internal"
|
|
return cs_guestnetwork.merge(dbag, d)
|
|
|
|
def process_dhcp_entry(self, dbag):
|
|
return cs_dhcp.merge(dbag, self.qFile.data)
|
|
|
|
def process_site2sitevpn(self, dbag):
|
|
return cs_site2sitevpn.merge(dbag, self.qFile.data)
|
|
|
|
def process_remoteaccessvpn(self, dbag):
|
|
return cs_remoteaccessvpn.merge(dbag, self.qFile.data)
|
|
|
|
def process_vpnusers(self, dbag):
|
|
return cs_vpnusers.merge(dbag, self.qFile.data)
|
|
|
|
def process_network_acl(self, dbag):
|
|
return cs_network_acl.merge(dbag, self.qFile.data)
|
|
|
|
def process_firewallrules(self, dbag):
|
|
return cs_firewallrules.merge(dbag, self.qFile.data)
|
|
|
|
def process_ipv6firewallrules(self, dbag):
|
|
return cs_firewallrules.merge(dbag, self.qFile.data)
|
|
|
|
def process_loadbalancer(self, dbag):
|
|
return cs_loadbalancer.merge(dbag, self.qFile.data)
|
|
|
|
def process_monitorservice(self, dbag):
|
|
return cs_monitorservice.merge(dbag, self.qFile.data)
|
|
|
|
def process_staticroutes(self, dbag):
|
|
return cs_staticroutes.merge(dbag, self.qFile.data)
|
|
|
|
def process_bgppeers(self, dbag):
|
|
return cs_bgppeers.merge(dbag, self.qFile.data)
|
|
|
|
def processVMpassword(self, dbag):
|
|
return cs_vmp.merge(dbag, self.qFile.data)
|
|
|
|
def processForwardingRules(self, dbag):
|
|
# to be used by both staticnat and portforwarding
|
|
return cs_forwardingrules.merge(dbag, self.qFile.data)
|
|
|
|
def processIP(self, dbag):
|
|
for ip in self.qFile.data["ip_address"]:
|
|
dbag = cs_ip.merge(dbag, ip)
|
|
return dbag
|
|
|
|
def processCL(self, dbag):
|
|
# Convert the ip stuff to an ip object and pass that into cs_ip_merge
|
|
# "eth0ip": "192.168.56.32",
|
|
# "eth0mask": "255.255.255.0",
|
|
self.newData = []
|
|
if (self.qFile.data['cmd_line']['type'] == "router"):
|
|
self.processCLItem('0', "guest")
|
|
self.processCLItem('1', "control")
|
|
self.processCLItem('2', "public")
|
|
elif (self.qFile.data['cmd_line']['type'] == "vpcrouter"):
|
|
self.processCLItem('0', "control")
|
|
elif (self.qFile.data['cmd_line']['type'] == "dhcpsrvr"):
|
|
self.processCLItem('0', "guest")
|
|
self.processCLItem('1', "control")
|
|
elif (self.qFile.data['cmd_line']['type'] == "ilbvm"):
|
|
self.processCLItem('0', "guest")
|
|
self.processCLItem('1', "control")
|
|
|
|
return cs_cmdline.merge(dbag, self.qFile.data)
|
|
|
|
def processCLItem(self, num, nw_type):
|
|
key = 'eth' + num + 'ip'
|
|
dp = {}
|
|
if key in self.qFile.data['cmd_line']:
|
|
dp['public_ip'] = self.qFile.data['cmd_line'][key]
|
|
dp['netmask'] = self.qFile.data['cmd_line']['eth' + num + 'mask']
|
|
dp['source_nat'] = False
|
|
dp['add'] = True
|
|
dp['one_to_one_nat'] = False
|
|
if nw_type == "public":
|
|
dp['gateway'] = self.qFile.data['cmd_line']['gateway']
|
|
else:
|
|
if 'localgw' in self.qFile.data['cmd_line']:
|
|
dp['gateway'] = self.qFile.data['cmd_line']['localgw']
|
|
else:
|
|
dp['gateway'] = ''
|
|
dp['nic_dev_id'] = num
|
|
dp['nw_type'] = nw_type
|
|
qf = QueueFile()
|
|
qf.load({'ip_address': [dp], 'type': 'ips'})
|
|
|
|
def processVmData(self, dbag):
|
|
cs_vmdata.merge(dbag, self.qFile.data)
|
|
return dbag
|
|
|
|
def process_ipaliases(self, dbag):
|
|
nic_dev = None
|
|
# Should be a way to deal with this better
|
|
for intf, data in list(dbag.items()):
|
|
if intf == 'id':
|
|
continue
|
|
elif any([net['nw_type'] == 'guest' for net in data]):
|
|
nic_dev = intf
|
|
break
|
|
|
|
assert nic_dev is not None, 'Unable to determine Guest interface'
|
|
|
|
nic_dev_id = nic_dev[3:]
|
|
|
|
for alias in self.qFile.data['aliases']:
|
|
ip = {
|
|
'add': not alias['revoke'],
|
|
'nw_type': 'guest',
|
|
'public_ip': alias['ip_address'],
|
|
'netmask': alias['netmask'],
|
|
'nic_dev_id': nic_dev_id
|
|
}
|
|
dbag = cs_ip.merge(dbag, ip)
|
|
return dbag
|
|
|
|
|
|
class QueueFile:
|
|
|
|
fileName = ''
|
|
configCache = "/var/cache/cloud"
|
|
keep = True
|
|
data = {}
|
|
|
|
def load(self, data):
|
|
if data is not None:
|
|
self.data = data
|
|
self.type = self.data["type"]
|
|
updateDataBag(self)
|
|
return
|
|
filename = '{cache_location}/{json_file}'.format(cache_location=self.configCache, json_file=self.fileName)
|
|
try:
|
|
handle = open(filename)
|
|
except IOError as exception:
|
|
error_message = ("Exception occurred with the following exception error '{error}'. Could not open '{filename}'. "
|
|
"It seems that the file has already been moved.".format(error=exception, filename=filename))
|
|
logging.error(error_message)
|
|
else:
|
|
logging.info("Continuing with the processing of file '{filename}'".format(filename=filename))
|
|
|
|
self.data = json.load(handle)
|
|
self.type = self.data["type"]
|
|
handle.close()
|
|
if self.keep:
|
|
self.__moveFile(filename, self.configCache + "/processed")
|
|
else:
|
|
logging.debug("Processed file deleted: %s and not kept in /processed", filename)
|
|
os.remove(filename)
|
|
updateDataBag(self)
|
|
|
|
def setFile(self, name):
|
|
self.fileName = name
|
|
|
|
def getType(self):
|
|
return self.type
|
|
|
|
def getData(self):
|
|
return self.data
|
|
|
|
def setPath(self, path):
|
|
self.configCache = path
|
|
|
|
def __moveFile(self, origPath, path):
|
|
if not os.path.exists(path):
|
|
os.makedirs(path)
|
|
originalName = os.path.basename(origPath)
|
|
if originalName.count(".") == 1:
|
|
originalName += "." + str(uuid.uuid4())
|
|
zipped_file_name = path + "/" + originalName + ".gz"
|
|
with open(origPath, 'rb') as f_in, gzip.open(zipped_file_name, 'wb') as f_out:
|
|
shutil.copyfileobj(f_in, f_out)
|
|
os.remove(origPath)
|
|
|
|
logging.debug("Processed file written to %s", zipped_file_name)
|