if ep.service_id == maint_id and
ep.interface == 'public'][0]
self.log.info('maintenance endpoint: %s' % self.maint_endpoint)
-
+ self.update_constraints_lock = False
self.update_constraints()
def delete_remote_instance_constraints(self, instance_id):
self.delete_remote_group_constraints(self.ha_group)
def update_constraints(self):
+ while self.update_constraints_lock:
+ self.log.info('Waiting update_constraints_lock...')
+ time.sleep(1)
+ self.update_constraints_lock = True
self.log.info('Update constraints')
if self.project_id is None:
self.project_id = self.keystone.projects.list(
"recovery_time": 4,
"resource_mitigation": True}
self.log.info('create doctor_ha_app_group constraints: %s'
- % self.nonha_group)
+ % self.ha_group)
self.update_remote_group_constraints(self.ha_group)
instance_constraints = {}
for ha_instance in self.ha_instances:
"group_id": self.ha_group["group_id"],
"instance_name": ha_instance.name,
"max_interruption_time": 120,
- "migration_type": "MIGRATION",
+ "migration_type": "MIGRATE",
"resource_mitigation": True,
"lead_time": 40}
self.log.info('create ha instance constraints: %s'
"group_id": self.nonha_group["group_id"],
"instance_name": nonha_instance.name,
"max_interruption_time": 120,
- "migration_type": "MIGRATION",
+ "migration_type": "MIGRATE",
"resource_mitigation": True,
"lead_time": 40}
self.log.info('create nonha instance constraints: %s'
for instance_id in deleted:
self.delete_remote_instance_constraints(instance_id)
updated = added + modified
- for instance in [instance_constraints[i] in i in updated]:
+ for instance in [instance_constraints[i] for i in updated]:
self.update_remote_instance_constraints(instance)
if updated or deleted:
# Some instance constraints have changed
self.instance_constraints = instance_constraints.copy()
+ self.update_constraints_lock = False
def active_instance_id(self):
# Need rertry as it takes time after heat template done before
instance_ids = (self.get_session_instance_ids(
payload['instance_ids'],
payload['session_id']))
- reply['instance_ids'] = instance_ids
- reply_state = 'ACK_MAINTENANCE'
+ my_instance_ids = self.get_instance_ids()
+ invalid_instances = (
+ [instance_id for instance_id in instance_ids
+ if instance_id not in my_instance_ids])
+ if invalid_instances:
+ self.log.error('Invalid instances: %s' % invalid_instances)
+ reply_state = 'NACK_MAINTENANCE'
+ else:
+ reply_state = 'ACK_MAINTENANCE'
elif state == 'SCALE_IN':
# scale down "self.scale" instances that is VCPUS equaling
# at least a single compute node
self.scale_instances(-self.scale)
- reply['instance_ids'] = self.get_instance_ids()
reply_state = 'ACK_SCALE_IN'
elif state == 'MAINTENANCE_COMPLETE':
if reply_state:
if self.conf.admin_tool.type == 'fenix':
self.headers['X-Auth-Token'] = self.session.get_token()
- reply['session_id'] = payload['session_id']
reply['state'] = reply_state
url = payload['reply_url']
self.log.info('VNFM reply: %s' % reply)
dpkg -r --force-depends golang-docker-credential-helpers
}
-docker ps | grep fenix >/dev/null && {
-REMOTE=`docker exec -ti fenix git rev-parse origin/master`
-LOCAL=`docker exec -ti fenix git rev-parse @`
-if [ $LOCAL = $REMOTE ]; then
- echo "Fenix start: Already running latest"
+docker ps | grep fenix -q && {
+REMOTE=`git ls-remote https://opendev.org/x/fenix HEAD | awk '{ print $1}'`
+LOCAL=`docker exec -t fenix git rev-parse @`
+if [[ "$LOCAL" =~ "$REMOTE" ]]; then
+ # Difference in above string ending marks, so cannot compare equal
+ echo "Fenix start: Already running latest $LOCAL equals $REMOTE"
exit 0
else
- echo "Fenix container needs to be recreated..."
+ echo "Fenix container needs to be recreated $LOCAL not $REMOTE"
# Remove previous container
for img in `docker image list | grep "^fenix" | awk '{print $1}'`; do
for dock in `docker ps --all -f "ancestor=$img" | grep "$img" | awk '{print $1}'`; do
echo "username = $OS_USERNAME" >> fenix-api.conf
echo "cafile = /opt/stack/data/ca-bundle.pem" >> fenix-api.conf
-openstack service list | grep maintenance | {
+openstack service list | grep -q maintenance || {
openstack service create --name fenix --enable maintenance
openstack endpoint create --region $OS_REGION_NAME --enable fenix public http://localhost:12347/v1
}
def set_apply_patches(self):
self.log.info('Set apply patches start......')
fenix_files = None
-
set_scripts = [self.cm_set_script]
+ thrs = []
restart_cmd = 'sudo systemctl restart' \
' ceilometer-agent-notification.service'
'admin_tool/fenix',
fenix_file)
client.scp(src_file, fenix_file)
- self._run_apply_patches(client,
- restart_cmd,
- set_scripts,
- python=self.python)
+ thrs.append(self._run_apply_patches(client,
+ restart_cmd,
+ set_scripts,
+ python=self.python))
time.sleep(5)
self.log.info('Set apply patches start......')
for node_ip in self.computes:
client = SSHClient(node_ip, self.node_user_name,
key_filename=self.key_file)
- self._run_apply_patches(client,
- restart_cmd,
- [self.nc_set_compute_script],
- python=self.python)
+ thrs.append(self._run_apply_patches(
+ client,
+ restart_cmd,
+ [self.nc_set_compute_script],
+ python=self.python))
time.sleep(5)
+ # If Fenix container ir build, it needs to be ready before continue
+ for thr in thrs:
+ thr.join()
def restore_apply_patches(self):
self.log.info('restore apply patches start......')