Sync ch and update InternalEndpointContext
Change-Id: I83ab0229b40266eebf508486427582c9c5cc3ff2 Partial-Bug: 1733566
This commit is contained in:
parent
902d83ed3e
commit
7620ce8925
|
@ -13,6 +13,7 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import six
|
import six
|
||||||
|
@ -185,7 +186,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
self.d.configure(service, config)
|
self.d.configure(service, config)
|
||||||
|
|
||||||
def _auto_wait_for_status(self, message=None, exclude_services=None,
|
def _auto_wait_for_status(self, message=None, exclude_services=None,
|
||||||
include_only=None, timeout=1800):
|
include_only=None, timeout=None):
|
||||||
"""Wait for all units to have a specific extended status, except
|
"""Wait for all units to have a specific extended status, except
|
||||||
for any defined as excluded. Unless specified via message, any
|
for any defined as excluded. Unless specified via message, any
|
||||||
status containing any case of 'ready' will be considered a match.
|
status containing any case of 'ready' will be considered a match.
|
||||||
|
@ -215,7 +216,10 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
:param timeout: Maximum time in seconds to wait for status match
|
:param timeout: Maximum time in seconds to wait for status match
|
||||||
:returns: None. Raises if timeout is hit.
|
:returns: None. Raises if timeout is hit.
|
||||||
"""
|
"""
|
||||||
self.log.info('Waiting for extended status on units...')
|
if not timeout:
|
||||||
|
timeout = int(os.environ.get('AMULET_SETUP_TIMEOUT', 1800))
|
||||||
|
self.log.info('Waiting for extended status on units for {}s...'
|
||||||
|
''.format(timeout))
|
||||||
|
|
||||||
all_services = self.d.services.keys()
|
all_services = self.d.services.keys()
|
||||||
|
|
||||||
|
@ -252,9 +256,9 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
service_messages = {service: message for service in services}
|
service_messages = {service: message for service in services}
|
||||||
|
|
||||||
# Check for idleness
|
# Check for idleness
|
||||||
self.d.sentry.wait()
|
self.d.sentry.wait(timeout=timeout)
|
||||||
# Check for error states and bail early
|
# Check for error states and bail early
|
||||||
self.d.sentry.wait_for_status(self.d.juju_env, services)
|
self.d.sentry.wait_for_status(self.d.juju_env, services, timeout=timeout)
|
||||||
# Check for ready messages
|
# Check for ready messages
|
||||||
self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
|
self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
|
||||||
|
|
||||||
|
|
|
@ -858,9 +858,12 @@ class OpenStackAmuletUtils(AmuletUtils):
|
||||||
:returns: List of pool name, object count, kb disk space used
|
:returns: List of pool name, object count, kb disk space used
|
||||||
"""
|
"""
|
||||||
df = self.get_ceph_df(sentry_unit)
|
df = self.get_ceph_df(sentry_unit)
|
||||||
pool_name = df['pools'][pool_id]['name']
|
for pool in df['pools']:
|
||||||
obj_count = df['pools'][pool_id]['stats']['objects']
|
if pool['id'] == pool_id:
|
||||||
kb_used = df['pools'][pool_id]['stats']['kb_used']
|
pool_name = pool['name']
|
||||||
|
obj_count = pool['stats']['objects']
|
||||||
|
kb_used = pool['stats']['kb_used']
|
||||||
|
|
||||||
self.log.debug('Ceph {} pool (ID {}): {} objects, '
|
self.log.debug('Ceph {} pool (ID {}): {} objects, '
|
||||||
'{} kb used'.format(pool_name, pool_id,
|
'{} kb used'.format(pool_name, pool_id,
|
||||||
obj_count, kb_used))
|
obj_count, kb_used))
|
||||||
|
|
|
@ -101,6 +101,8 @@ from charmhelpers.contrib.openstack.utils import (
|
||||||
git_determine_python_path,
|
git_determine_python_path,
|
||||||
enable_memcache,
|
enable_memcache,
|
||||||
snap_install_requested,
|
snap_install_requested,
|
||||||
|
CompareOpenStackReleases,
|
||||||
|
os_release,
|
||||||
)
|
)
|
||||||
from charmhelpers.core.unitdata import kv
|
from charmhelpers.core.unitdata import kv
|
||||||
|
|
||||||
|
@ -1566,8 +1568,18 @@ class InternalEndpointContext(OSContextGenerator):
|
||||||
endpoints by default so this allows admins to optionally use internal
|
endpoints by default so this allows admins to optionally use internal
|
||||||
endpoints.
|
endpoints.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self, ost_rel_check_pkg_name):
|
||||||
|
self.ost_rel_check_pkg_name = ost_rel_check_pkg_name
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
return {'use_internal_endpoints': config('use-internal-endpoints')}
|
ctxt = {'use_internal_endpoints': config('use-internal-endpoints')}
|
||||||
|
rel = os_release(self.ost_rel_check_pkg_name, base='icehouse')
|
||||||
|
if CompareOpenStackReleases(rel) >= 'pike':
|
||||||
|
ctxt['volume_api_version'] = '3'
|
||||||
|
else:
|
||||||
|
ctxt['volume_api_version'] = '2'
|
||||||
|
|
||||||
|
return ctxt
|
||||||
|
|
||||||
|
|
||||||
class AppArmorContext(OSContextGenerator):
|
class AppArmorContext(OSContextGenerator):
|
||||||
|
|
|
@ -392,6 +392,8 @@ def get_swift_codename(version):
|
||||||
releases = UBUNTU_OPENSTACK_RELEASE
|
releases = UBUNTU_OPENSTACK_RELEASE
|
||||||
release = [k for k, v in six.iteritems(releases) if codename in v]
|
release = [k for k, v in six.iteritems(releases) if codename in v]
|
||||||
ret = subprocess.check_output(['apt-cache', 'policy', 'swift'])
|
ret = subprocess.check_output(['apt-cache', 'policy', 'swift'])
|
||||||
|
if six.PY3:
|
||||||
|
ret = ret.decode('UTF-8')
|
||||||
if codename in ret or release[0] in ret:
|
if codename in ret or release[0] in ret:
|
||||||
return codename
|
return codename
|
||||||
elif len(codenames) == 1:
|
elif len(codenames) == 1:
|
||||||
|
|
|
@ -377,12 +377,12 @@ def get_mon_map(service):
|
||||||
try:
|
try:
|
||||||
return json.loads(mon_status)
|
return json.loads(mon_status)
|
||||||
except ValueError as v:
|
except ValueError as v:
|
||||||
log("Unable to parse mon_status json: {}. Error: {}".format(
|
log("Unable to parse mon_status json: {}. Error: {}"
|
||||||
mon_status, v.message))
|
.format(mon_status, str(v)))
|
||||||
raise
|
raise
|
||||||
except CalledProcessError as e:
|
except CalledProcessError as e:
|
||||||
log("mon_status command failed with message: {}".format(
|
log("mon_status command failed with message: {}"
|
||||||
e.message))
|
.format(str(e)))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import functools
|
||||||
from subprocess import (
|
from subprocess import (
|
||||||
CalledProcessError,
|
CalledProcessError,
|
||||||
check_call,
|
check_call,
|
||||||
|
@ -101,3 +102,52 @@ def create_lvm_volume_group(volume_group, block_device):
|
||||||
:block_device: str: Full path of PV-initialized block device.
|
:block_device: str: Full path of PV-initialized block device.
|
||||||
'''
|
'''
|
||||||
check_call(['vgcreate', volume_group, block_device])
|
check_call(['vgcreate', volume_group, block_device])
|
||||||
|
|
||||||
|
|
||||||
|
def list_logical_volumes(select_criteria=None, path_mode=False):
|
||||||
|
'''
|
||||||
|
List logical volumes
|
||||||
|
|
||||||
|
:param select_criteria: str: Limit list to those volumes matching this
|
||||||
|
criteria (see 'lvs -S help' for more details)
|
||||||
|
:param path_mode: bool: return logical volume name in 'vg/lv' format, this
|
||||||
|
format is required for some commands like lvextend
|
||||||
|
:returns: [str]: List of logical volumes
|
||||||
|
'''
|
||||||
|
lv_diplay_attr = 'lv_name'
|
||||||
|
if path_mode:
|
||||||
|
# Parsing output logic relies on the column order
|
||||||
|
lv_diplay_attr = 'vg_name,' + lv_diplay_attr
|
||||||
|
cmd = ['lvs', '--options', lv_diplay_attr, '--noheadings']
|
||||||
|
if select_criteria:
|
||||||
|
cmd.extend(['--select', select_criteria])
|
||||||
|
lvs = []
|
||||||
|
for lv in check_output(cmd).decode('UTF-8').splitlines():
|
||||||
|
if not lv:
|
||||||
|
continue
|
||||||
|
if path_mode:
|
||||||
|
lvs.append('/'.join(lv.strip().split()))
|
||||||
|
else:
|
||||||
|
lvs.append(lv.strip())
|
||||||
|
return lvs
|
||||||
|
|
||||||
|
|
||||||
|
list_thin_logical_volume_pools = functools.partial(
|
||||||
|
list_logical_volumes,
|
||||||
|
select_criteria='lv_attr =~ ^t')
|
||||||
|
|
||||||
|
list_thin_logical_volumes = functools.partial(
|
||||||
|
list_logical_volumes,
|
||||||
|
select_criteria='lv_attr =~ ^V')
|
||||||
|
|
||||||
|
|
||||||
|
def extend_logical_volume_by_device(lv_name, block_device):
|
||||||
|
'''
|
||||||
|
Extends the size of logical volume lv_name by the amount of free space on
|
||||||
|
physical volume block_device.
|
||||||
|
|
||||||
|
:param lv_name: str: name of logical volume to be extended (vg/lv format)
|
||||||
|
:param block_device: str: name of block_device to be allocated to lv_name
|
||||||
|
'''
|
||||||
|
cmd = ['lvextend', lv_name, block_device]
|
||||||
|
check_call(cmd)
|
||||||
|
|
|
@ -549,6 +549,8 @@ def write_file(path, content, owner='root', group='root', perms=0o444):
|
||||||
with open(path, 'wb') as target:
|
with open(path, 'wb') as target:
|
||||||
os.fchown(target.fileno(), uid, gid)
|
os.fchown(target.fileno(), uid, gid)
|
||||||
os.fchmod(target.fileno(), perms)
|
os.fchmod(target.fileno(), perms)
|
||||||
|
if six.PY3 and isinstance(content, six.string_types):
|
||||||
|
content = content.encode('UTF-8')
|
||||||
target.write(content)
|
target.write(content)
|
||||||
return
|
return
|
||||||
# the contents were the same, but we might still need to change the
|
# the contents were the same, but we might still need to change the
|
||||||
|
|
|
@ -20,6 +20,7 @@ UBUNTU_RELEASES = (
|
||||||
'yakkety',
|
'yakkety',
|
||||||
'zesty',
|
'zesty',
|
||||||
'artful',
|
'artful',
|
||||||
|
'bionic',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ CONFIG_FILES = OrderedDict([
|
||||||
context.SharedDBContext(relation_prefix='heat',
|
context.SharedDBContext(relation_prefix='heat',
|
||||||
ssl_dir=HEAT_DIR),
|
ssl_dir=HEAT_DIR),
|
||||||
context.OSConfigFlagContext(),
|
context.OSConfigFlagContext(),
|
||||||
context.InternalEndpointContext(),
|
context.InternalEndpointContext('heat-common'),
|
||||||
HeatIdentityServiceContext(service=SVC, service_user=SVC),
|
HeatIdentityServiceContext(service=SVC, service_user=SVC),
|
||||||
HeatHAProxyContext(),
|
HeatHAProxyContext(),
|
||||||
HeatSecurityContext(),
|
HeatSecurityContext(),
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import six
|
import six
|
||||||
|
@ -185,7 +186,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
self.d.configure(service, config)
|
self.d.configure(service, config)
|
||||||
|
|
||||||
def _auto_wait_for_status(self, message=None, exclude_services=None,
|
def _auto_wait_for_status(self, message=None, exclude_services=None,
|
||||||
include_only=None, timeout=1800):
|
include_only=None, timeout=None):
|
||||||
"""Wait for all units to have a specific extended status, except
|
"""Wait for all units to have a specific extended status, except
|
||||||
for any defined as excluded. Unless specified via message, any
|
for any defined as excluded. Unless specified via message, any
|
||||||
status containing any case of 'ready' will be considered a match.
|
status containing any case of 'ready' will be considered a match.
|
||||||
|
@ -215,7 +216,10 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
:param timeout: Maximum time in seconds to wait for status match
|
:param timeout: Maximum time in seconds to wait for status match
|
||||||
:returns: None. Raises if timeout is hit.
|
:returns: None. Raises if timeout is hit.
|
||||||
"""
|
"""
|
||||||
self.log.info('Waiting for extended status on units...')
|
if not timeout:
|
||||||
|
timeout = int(os.environ.get('AMULET_SETUP_TIMEOUT', 1800))
|
||||||
|
self.log.info('Waiting for extended status on units for {}s...'
|
||||||
|
''.format(timeout))
|
||||||
|
|
||||||
all_services = self.d.services.keys()
|
all_services = self.d.services.keys()
|
||||||
|
|
||||||
|
@ -252,9 +256,9 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
||||||
service_messages = {service: message for service in services}
|
service_messages = {service: message for service in services}
|
||||||
|
|
||||||
# Check for idleness
|
# Check for idleness
|
||||||
self.d.sentry.wait()
|
self.d.sentry.wait(timeout=timeout)
|
||||||
# Check for error states and bail early
|
# Check for error states and bail early
|
||||||
self.d.sentry.wait_for_status(self.d.juju_env, services)
|
self.d.sentry.wait_for_status(self.d.juju_env, services, timeout=timeout)
|
||||||
# Check for ready messages
|
# Check for ready messages
|
||||||
self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
|
self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
|
||||||
|
|
||||||
|
|
|
@ -858,9 +858,12 @@ class OpenStackAmuletUtils(AmuletUtils):
|
||||||
:returns: List of pool name, object count, kb disk space used
|
:returns: List of pool name, object count, kb disk space used
|
||||||
"""
|
"""
|
||||||
df = self.get_ceph_df(sentry_unit)
|
df = self.get_ceph_df(sentry_unit)
|
||||||
pool_name = df['pools'][pool_id]['name']
|
for pool in df['pools']:
|
||||||
obj_count = df['pools'][pool_id]['stats']['objects']
|
if pool['id'] == pool_id:
|
||||||
kb_used = df['pools'][pool_id]['stats']['kb_used']
|
pool_name = pool['name']
|
||||||
|
obj_count = pool['stats']['objects']
|
||||||
|
kb_used = pool['stats']['kb_used']
|
||||||
|
|
||||||
self.log.debug('Ceph {} pool (ID {}): {} objects, '
|
self.log.debug('Ceph {} pool (ID {}): {} objects, '
|
||||||
'{} kb used'.format(pool_name, pool_id,
|
'{} kb used'.format(pool_name, pool_id,
|
||||||
obj_count, kb_used))
|
obj_count, kb_used))
|
||||||
|
|
|
@ -549,6 +549,8 @@ def write_file(path, content, owner='root', group='root', perms=0o444):
|
||||||
with open(path, 'wb') as target:
|
with open(path, 'wb') as target:
|
||||||
os.fchown(target.fileno(), uid, gid)
|
os.fchown(target.fileno(), uid, gid)
|
||||||
os.fchmod(target.fileno(), perms)
|
os.fchmod(target.fileno(), perms)
|
||||||
|
if six.PY3 and isinstance(content, six.string_types):
|
||||||
|
content = content.encode('UTF-8')
|
||||||
target.write(content)
|
target.write(content)
|
||||||
return
|
return
|
||||||
# the contents were the same, but we might still need to change the
|
# the contents were the same, but we might still need to change the
|
||||||
|
|
|
@ -20,6 +20,7 @@ UBUNTU_RELEASES = (
|
||||||
'yakkety',
|
'yakkety',
|
||||||
'zesty',
|
'zesty',
|
||||||
'artful',
|
'artful',
|
||||||
|
'bionic',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue