adding management host update action
This commit is contained in:

committed by
Tim Simpson

parent
8a53f3e50d
commit
71f223e60b
@@ -19,6 +19,7 @@ from reddwarf.common import wsgi
|
|||||||
from reddwarf.versions import VersionsController
|
from reddwarf.versions import VersionsController
|
||||||
from reddwarf.flavor.service import FlavorController
|
from reddwarf.flavor.service import FlavorController
|
||||||
from reddwarf.instance.service import InstanceController
|
from reddwarf.instance.service import InstanceController
|
||||||
|
from reddwarf.extensions.mgmt.host.instance.service import HostInstanceController
|
||||||
|
|
||||||
|
|
||||||
class API(wsgi.Router):
|
class API(wsgi.Router):
|
||||||
@@ -45,6 +46,13 @@ class API(wsgi.Router):
|
|||||||
path = "/{tenant_id}/flavors"
|
path = "/{tenant_id}/flavors"
|
||||||
mapper.resource("flavor", path, controller=flavor_resource)
|
mapper.resource("flavor", path, controller=flavor_resource)
|
||||||
|
|
||||||
|
def _host_instance_router(self, mapper):
|
||||||
|
host_instance_resource = HostInstanceController().create_resource()
|
||||||
|
path = "/{tenant_id}/mgmt/hosts/{host_id}/instances"
|
||||||
|
mapper.resource("hostinstance", path,
|
||||||
|
controller=host_instance_resource,
|
||||||
|
member={'action': 'POST'})
|
||||||
|
|
||||||
|
|
||||||
def app_factory(global_conf, **local_conf):
|
def app_factory(global_conf, **local_conf):
|
||||||
return API()
|
return API()
|
||||||
|
@@ -21,6 +21,7 @@ from reddwarf.common import extensions
|
|||||||
from reddwarf.common import wsgi
|
from reddwarf.common import wsgi
|
||||||
from reddwarf.extensions.mgmt.instances.service import MgmtInstanceController
|
from reddwarf.extensions.mgmt.instances.service import MgmtInstanceController
|
||||||
from reddwarf.extensions.mgmt.host.service import HostController
|
from reddwarf.extensions.mgmt.host.service import HostController
|
||||||
|
from reddwarf.extensions.mgmt.host.instance.service import HostInstanceController
|
||||||
from reddwarf.extensions.mgmt.volume.service import StorageController
|
from reddwarf.extensions.mgmt.volume.service import StorageController
|
||||||
|
|
||||||
|
|
||||||
@@ -74,4 +75,14 @@ class Mgmt(extensions.ExtensionsDescriptor):
|
|||||||
)
|
)
|
||||||
resources.append(storage)
|
resources.append(storage)
|
||||||
|
|
||||||
|
host_instances = extensions.ResourceExtension('instances',
|
||||||
|
HostInstanceController(),
|
||||||
|
parent={'member_name': 'host',
|
||||||
|
'collection_name': '{tenant_id}/mgmt/hosts'},
|
||||||
|
deserializer=wsgi.RequestDeserializer(),
|
||||||
|
serializer=serializer,
|
||||||
|
collection_actions={'action': 'POST'},
|
||||||
|
)
|
||||||
|
resources.append(host_instances)
|
||||||
|
|
||||||
return resources
|
return resources
|
||||||
|
16
reddwarf/extensions/mgmt/host/instance/__init__.py
Normal file
16
reddwarf/extensions/mgmt/host/instance/__init__.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2012 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
60
reddwarf/extensions/mgmt/host/instance/service.py
Normal file
60
reddwarf/extensions/mgmt/host/instance/service.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2012 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from reddwarf.common import exception
|
||||||
|
from reddwarf.common import wsgi
|
||||||
|
from reddwarf.extensions.mgmt.host import models
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class HostInstanceController(wsgi.Controller):
|
||||||
|
"""Controller for all instances on specific hosts."""
|
||||||
|
|
||||||
|
def action(self, req, body, tenant_id, host_id):
|
||||||
|
LOG.info("req : '%s'\n\n" % req)
|
||||||
|
LOG.info("Committing an ACTION against host %s for tenant '%s'"
|
||||||
|
% (host_id, tenant_id))
|
||||||
|
if not body:
|
||||||
|
raise exception.BadRequest(_("Invalid request body."))
|
||||||
|
context = req.environ[wsgi.CONTEXT_KEY]
|
||||||
|
host = models.DetailedHost.load(context, host_id)
|
||||||
|
_actions = {
|
||||||
|
'update': self._action_update
|
||||||
|
}
|
||||||
|
selected_action = None
|
||||||
|
for key in body:
|
||||||
|
if key in _actions:
|
||||||
|
if selected_action is not None:
|
||||||
|
msg = _("Only one action can be specified per request.")
|
||||||
|
raise exception.BadRequest(msg)
|
||||||
|
selected_action = _actions[key]
|
||||||
|
else:
|
||||||
|
msg = _("Invalid host action: %s") % key
|
||||||
|
raise exception.BadRequest(msg)
|
||||||
|
|
||||||
|
if selected_action:
|
||||||
|
return selected_action(context, host, body)
|
||||||
|
else:
|
||||||
|
raise exception.BadRequest(_("Invalid request body."))
|
||||||
|
|
||||||
|
def _action_update(self, context, host, body):
|
||||||
|
LOG.debug("Updating all instances for host: %s" % host.name)
|
||||||
|
host.update_all(context)
|
||||||
|
return wsgi.Result(None, 202)
|
@@ -77,6 +77,12 @@ class DetailedHost(object):
|
|||||||
"instance: %s" % instance['server_id'])
|
"instance: %s" % instance['server_id'])
|
||||||
instance['id'] = None
|
instance['id'] = None
|
||||||
|
|
||||||
|
def update_all(self, context):
|
||||||
|
num_i = len(self.instances)
|
||||||
|
LOG.debug("Host %s has %s instances to update" % (self.name, num_i))
|
||||||
|
for instance in self.instances:
|
||||||
|
client = create_guest_client(context, instance['id'])
|
||||||
|
client.update_guest()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load(context, name):
|
def load(context, name):
|
||||||
|
@@ -177,3 +177,7 @@ class API(object):
|
|||||||
LOG.debug(_("Check Volume Info on Instance %s"), self.id)
|
LOG.debug(_("Check Volume Info on Instance %s"), self.id)
|
||||||
return self._call("get_filesystem_stats", AGENT_LOW_TIMEOUT,
|
return self._call("get_filesystem_stats", AGENT_LOW_TIMEOUT,
|
||||||
fs_path="/var/lib/mysql")
|
fs_path="/var/lib/mysql")
|
||||||
|
|
||||||
|
def update_guest(self):
|
||||||
|
"""Make a synchronous call to update the guest agent."""
|
||||||
|
self._call("update_guest", AGENT_HIGH_TIMEOUT)
|
||||||
|
@@ -44,6 +44,10 @@ class FakeGuest(object):
|
|||||||
'threads': 2
|
'threads': 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def update_guest(self):
|
||||||
|
LOG.debug("Updating guest %s" % self.id)
|
||||||
|
self.version += 1
|
||||||
|
|
||||||
def create_database(self, databases):
|
def create_database(self, databases):
|
||||||
for db in databases:
|
for db in databases:
|
||||||
self.dbs[db['_name']] = db
|
self.dbs[db['_name']] = db
|
||||||
|
Reference in New Issue
Block a user