Fix dependencies add altering with utf8 migrate_version table change place of protocol files add config option for defining regions Use provided sshKeys in instance creation Return requested url in discovery protocol Fixes for cmd scripts Catch nova exception and re-raise GCE exception add two new empty projects for images list fixes for getProject - when cinderclient is old - when neutron is absent fix style and tests Change-Id: Id11d9d7b8613a9f59e054d1fd39ea6dccbe7b4f0
120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
# Copyright 2013 Cloudscaling Group, Inc
|
|
#
|
|
# Licensed 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.
|
|
|
|
from oslo.config import cfg
|
|
|
|
from gceapi.api import base_api
|
|
from gceapi.api import clients
|
|
from gceapi.api import operation_util
|
|
from gceapi.api import utils
|
|
from gceapi import exception
|
|
|
|
CONF = cfg.CONF
|
|
|
|
|
|
class API(base_api.API):
|
|
"""GCE Projects API."""
|
|
|
|
KIND = "project"
|
|
|
|
def _get_type(self):
|
|
return self.KIND
|
|
|
|
def get_item(self, context, name, scope=None):
|
|
project_name = context.project_name
|
|
|
|
keystone = clients.keystone(context)
|
|
project = [t for t in keystone.tenants.list()
|
|
if t.name == project_name][0]
|
|
|
|
result = utils.to_dict(project)
|
|
result["keypair"] = self._get_gce_keypair(context)
|
|
project_id = project.id
|
|
|
|
nova_limits = clients.nova(context).limits.get(tenant_id=project_id)
|
|
result["nova_limits"] = dict((l.name, l.value)
|
|
for l in nova_limits.absolute)
|
|
|
|
cinder_client = clients.cinder(context)
|
|
try:
|
|
result["cinder_quotas"] = utils.to_dict(
|
|
cinder_client.quotas.get(project_id, usage=True))
|
|
except TypeError:
|
|
# NOTE(apavlov): cinderclient of version 1.0.6 and below
|
|
# has no usage parameter
|
|
result["cinder_quotas"] = dict([("limit", x)
|
|
for x in utils.to_dict(cinder_client.quotas.get(project_id))])
|
|
|
|
net_api = CONF.get("network_api")
|
|
if net_api is None or ("quantum" in net_api
|
|
or "neutron" in net_api):
|
|
neutron_client = clients.neutron(context)
|
|
result["neutron_quota"] = (
|
|
neutron_client.show_quota(project_id)["quota"])
|
|
result["neutron_quota"]["network_used"] = len(neutron_client
|
|
.list_networks(tenant_id=project_id)["networks"])
|
|
result["neutron_quota"]["floatingip_used"] = len(neutron_client
|
|
.list_floatingips(tenant_id=project_id)["floatingips"])
|
|
result["neutron_quota"]["security_group_used"] = len(neutron_client
|
|
.list_security_groups(tenant_id=project_id)["security_groups"])
|
|
else:
|
|
result["neutron_quota"] = {}
|
|
|
|
return result
|
|
|
|
def get_items(self, context, scope=None):
|
|
raise exception.NotFound
|
|
|
|
def set_common_instance_metadata(self, context, metadata_list):
|
|
instance_metadata = dict(
|
|
[(x['key'], x['value']) for x in metadata_list])
|
|
operation_util.start_operation(context)
|
|
ssh_keys = instance_metadata.pop('sshKeys', None)
|
|
if ssh_keys:
|
|
nova_client = clients.nova(context)
|
|
for key_data in ssh_keys.split('\n'):
|
|
user_name, ssh_key = key_data.split(":")
|
|
self._update_key(nova_client, user_name, ssh_key)
|
|
|
|
def get_gce_user_keypair_name(self, context):
|
|
client = clients.nova(context)
|
|
for keypair in client.keypairs.list():
|
|
if keypair.name == context.user_name:
|
|
return keypair.name
|
|
|
|
return None
|
|
|
|
def _get_gce_keypair(self, context):
|
|
client = clients.nova(context)
|
|
key_datas = []
|
|
for keypair in client.keypairs.list():
|
|
key_datas.append(keypair.name + ':' + keypair.public_key)
|
|
|
|
if not key_datas:
|
|
return None
|
|
|
|
return {'key': 'sshKeys', 'value': "\n".join(key_datas)}
|
|
|
|
def _update_key(self, nova_client, user_name, ssh_key):
|
|
try:
|
|
keypair = nova_client.keypairs.get(user_name)
|
|
if keypair.public_key == ssh_key:
|
|
return
|
|
|
|
keypair.delete()
|
|
except clients.novaclient.exceptions.NotFound:
|
|
pass
|
|
|
|
keypair = nova_client.keypairs.create(user_name, ssh_key)
|