9c2e0bf3a0
The RESTART_REQUIRED service status set by guest agent should not be overridden by the health heartbeat mechanism. The RESTART_REQUIRED can only be changed when the instance is restarted or rebooted. Story: 2008612 Task: 41795 Change-Id: I98baf252452353237bc8fb14357df4e7bcb2867a
114 lines
4.0 KiB
Python
114 lines
4.0 KiB
Python
# Copyright 2011 OpenStack Foundation
|
|
# 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.
|
|
|
|
|
|
class ServiceStatus(object):
|
|
"""Represents the status of the app and in some rare cases the agent.
|
|
|
|
Code and description are what is stored in the database. "api_status"
|
|
refers to the status which comes back from the REST API.
|
|
"""
|
|
_lookup = {}
|
|
|
|
def __init__(self, code, description, api_status):
|
|
self._code = code
|
|
self._description = description
|
|
self._api_status = api_status
|
|
ServiceStatus._lookup[code] = self
|
|
|
|
@property
|
|
def action_is_allowed(self):
|
|
allowed_statuses = [
|
|
ServiceStatuses.RUNNING._code,
|
|
ServiceStatuses.SHUTDOWN._code,
|
|
ServiceStatuses.CRASHED._code,
|
|
ServiceStatuses.BLOCKED._code,
|
|
ServiceStatuses.HEALTHY._code,
|
|
ServiceStatuses.RESTART_REQUIRED._code,
|
|
]
|
|
return self._code in allowed_statuses
|
|
|
|
@property
|
|
def api_status(self):
|
|
return self._api_status
|
|
|
|
@property
|
|
def code(self):
|
|
return self._code
|
|
|
|
@property
|
|
def description(self):
|
|
return self._description
|
|
|
|
def __eq__(self, other):
|
|
if not isinstance(other, ServiceStatus):
|
|
return False
|
|
return self.code == other.code
|
|
|
|
@staticmethod
|
|
def from_code(code):
|
|
if code not in ServiceStatus._lookup:
|
|
msg = 'Status code %s is not a valid ServiceStatus integer code.'
|
|
raise ValueError(msg % code)
|
|
return ServiceStatus._lookup[code]
|
|
|
|
@staticmethod
|
|
def from_description(desc):
|
|
all_items = ServiceStatus._lookup.items()
|
|
status_codes = [code for (code, status) in all_items
|
|
if status.description == desc]
|
|
if not status_codes:
|
|
msg = 'Status description %s is not a valid ServiceStatus.'
|
|
raise ValueError(msg % desc)
|
|
return ServiceStatus._lookup[status_codes[0]]
|
|
|
|
@staticmethod
|
|
def is_valid_code(code):
|
|
return code in ServiceStatus._lookup
|
|
|
|
def __str__(self):
|
|
return self._description
|
|
|
|
def __repr__(self):
|
|
return self._api_status
|
|
|
|
|
|
class ServiceStatuses(object):
|
|
RUNNING = ServiceStatus(0x01, 'running', 'ACTIVE')
|
|
BLOCKED = ServiceStatus(0x02, 'blocked', 'BLOCKED')
|
|
PAUSED = ServiceStatus(0x03, 'paused', 'SHUTDOWN')
|
|
SHUTDOWN = ServiceStatus(0x04, 'shutdown', 'SHUTDOWN')
|
|
CRASHED = ServiceStatus(0x06, 'crashed', 'SHUTDOWN')
|
|
FAILED = ServiceStatus(0x08, 'failed to spawn', 'FAILED')
|
|
BUILDING = ServiceStatus(0x09, 'building', 'BUILD')
|
|
PROMOTING = ServiceStatus(0x10, 'promoting replica', 'PROMOTE')
|
|
EJECTING = ServiceStatus(0x11, 'ejecting replica source', 'EJECT')
|
|
LOGGING = ServiceStatus(0x12, 'transferring guest logs', 'LOGGING')
|
|
UNKNOWN = ServiceStatus(0x16, 'unknown', 'ERROR')
|
|
NEW = ServiceStatus(0x17, 'new', 'NEW')
|
|
DELETED = ServiceStatus(0x05, 'deleted', 'DELETED')
|
|
FAILED_TIMEOUT_GUESTAGENT = ServiceStatus(0x18, 'guestagent error',
|
|
'ERROR')
|
|
INSTANCE_READY = ServiceStatus(0x19, 'instance ready', 'BUILD')
|
|
RESTART_REQUIRED = ServiceStatus(0x20, 'restart required',
|
|
'RESTART_REQUIRED')
|
|
HEALTHY = ServiceStatus(0x21, 'healthy', 'HEALTHY')
|
|
UPGRADING = ServiceStatus(0x22, 'upgrading', 'UPGRADING')
|
|
RESTARTING = ServiceStatus(0x22, 'restarting', 'RESTARTING')
|
|
|
|
|
|
# Dissuade further additions at run-time.
|
|
ServiceStatus.__init__ = None
|