+import commands
from planetstack.config import Config
from openstack.client import OpenStackClient
-has_openstack = False
class OpenStackDriver:
def __init__(self, config = None, client=None):
self.config = Config()
self.admin_client = OpenStackClient()
- if has_openstack:
- self.admin_user = self.admin_client.keystone.users.find(name=self.admin_client.keystone.username)
- else:
- self.admin_user = None
+ self.admin_user = self.admin_client.keystone.users.find(name=self.admin_client.keystone.username)
if client:
self.shell = client
def delete_user(self, id):
users = self.shell.keystone.users.findall(id=id)
for user in users:
+ # delete users keys
+ keys = self.shell.nova.keypairs.findall()
+ for key in keys:
+ self.shell.nova.keypairs.delete(key)
self.shell.keystone.users.delete(user)
return 1
return 1
- def update_user(self, id, **kwds):
- return self.shell.keystone.users.update(id, **kwds)
+ def update_user(self, id, fields):
+ if 'password' in fields:
+ self.shell.keystone.users.update_password(id, fields['password'])
+ if 'enabled' in fields:
+ self.shell.keystone.users.update_enabled(id, fields['enabled'])
+ return 1
def create_router(self, name, set_gateway=True):
routers = self.shell.quantum.list_routers(name=name)['routers']
'dns_nameservers': ['8.8.8.8', '8.8.4.4'],
'allocation_pools': allocation_pools}}
subnet = self.shell.quantum.create_subnet(subnet)['subnet']
-
+ self.add_external_route(subnet)
# TODO: Add route to external network
# e.g. # route add -net 10.0.3.0/24 dev br-ex gw 10.100.0.5
return subnet
if subnet['id'] == id:
self.delete_subnet_ports(subnet['id'])
self.shell.quantum.delete_subnet(id)
- return
+ self.delete_external_route(subnet)
+ return 1
+
+ def add_external_route(self, subnet):
+ ports = self.shell.quantum.list_ports()['ports']
+
+ gw_ip = subnet['gateway_ip']
+ subnet_id = subnet['id']
+
+ # 1. Find the port associated with the subnet's gateway
+ # 2. Find the router associated with that port
+ # 3. Find the port associated with this router and on the external net
+ # 4. Set up route to the subnet through the port from step 3
+ ip_address = None
+ for port in ports:
+ for fixed_ip in port['fixed_ips']:
+ if fixed_ip['subnet_id'] == subnet_id and fixed_ip['ip_address'] == gw_ip:
+ gw_port = port
+ router_id = gw_port['device_id']
+ router = self.shell.quantum.show_router(router_id)['router']
+ ext_net = router['external_gateway_info']['network_id']
+ for port in ports:
+ if port['device_id'] == router_id and port['network_id'] == ext_net:
+ ip_address = port['fixed_ips'][0]['ip_address']
+
+ if ip_address:
+ cmd = "route add -net %s dev br-ex gw %s" % (subnet['cidr'], ip_address)
+ commands.getstatusoutput(cmd)
+
+ return 1
+
+ def delete_external_route(self, subnet):
+ ports = self.shell.quantum.list_ports()['ports']
+
+ gw_ip = subnet['gateway_ip']
+ subnet_id = subnet['id']
+
+ # 1. Find the port associated with the subnet's gateway
+ # 2. Find the router associated with that port
+ # 3. Find the port associated with this router and on the external net
+ # 4. Set up route to the subnet through the port from step 3
+ ip_address = None
+ for port in ports:
+ for fixed_ip in port['fixed_ips']:
+ if fixed_ip['subnet_id'] == subnet_id and fixed_ip['ip_address'] == gw_ip:
+ gw_port = port
+ router_id = gw_port['device_id']
+ router = self.shell.quantum.show_router(router_id)['router']
+ ext_net = router['external_gateway_info']['network_id']
+ for port in ports:
+ if port['device_id'] == router_id and port['network_id'] == ext_net:
+ ip_address = port['fixed_ips'][0]['ip_address']
+
+ if ip_address:
+ cmd = "route delete -net %s" % (subnet['cidr'])
+ commands.getstatusoutput(cmd)
+
+ return 1
- def create_keypair(self, name, key):
+ def create_keypair(self, name, public_key):
keys = self.shell.nova.keypairs.findall(name=name)
if keys:
key = keys[0]
+ # update key
+ if key.public_key != public_key:
+ self.delete_keypair(key.id)
+ key = self.shell.nova.keypairs.create(name=name, public_key=public_key)
else:
- key = self.shell.nova.keypairs.create(name=name, public_key=key)
+ key = self.shell.nova.keypairs.create(name=name, public_key=public_key)
return key
def delete_keypair(self, id):
if not security_group:
security_group = self.config.nova_default_security_group
- #authorized_keys = "\n".join(pubkeys)
- #files = {'/root/.ssh/authorized_keys': authorized_keys}
files = {}
+ if pubkeys:
+ files['/root/.ssh/authorized_keys'] = "\n".join(pubkeys)
hints = {}
availability_zone = None