Files
gce-api/gceapi/api/project_api.py
Andrey Pavlov 97108dda10 backport fixes to upstream
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
2014-03-15 22:11:48 +04:00

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)