b7e2e49f7f
For almost any data we write to ZK (except for long-standing nodepool classes), add the sort_keys=True so that we can more easily determine whether an update is required. This is in service of zkobject, and is not strictly necessary because the json module follows dict insertion order, and our serialize methods are obviously internally consistent (at least, if they're going to produce the same data, which is all we care about). But that hasn't always been true and might not be true in the future, so this is good future-proofing. Based on a similar thought, the argument is also added to several places which do not use zkobject but which do write to ZK, in case we perform a similar check in the future. This seems like a good habit to use throughout the code base. Change-Id: Idca67942c057ab0e6b629b50b9b3367ccc0e4ad7
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
# Copyright 2021 Acme Gating, LLC
|
|
#
|
|
# 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 json
|
|
import logging
|
|
import uuid
|
|
|
|
from kazoo.exceptions import NoNodeError, NodeExistsError
|
|
|
|
from zuul.zk import ZooKeeperBase
|
|
|
|
|
|
# This is outside of the /zuul root, so this holds data we expect to
|
|
# be persistent (it will not be deleted by 'zuul delete-state').
|
|
SYSTEM_ROOT = "/zuul-system"
|
|
|
|
|
|
class ZuulSystem(ZooKeeperBase):
|
|
"""Information about the complete Zuul system
|
|
|
|
Currently includes only a system UUID for use with Nodepool.
|
|
"""
|
|
|
|
log = logging.getLogger("zuul.System")
|
|
|
|
def __init__(self, client):
|
|
super().__init__(client)
|
|
try:
|
|
data, stat = self.kazoo_client.get(SYSTEM_ROOT)
|
|
except NoNodeError:
|
|
system_id = uuid.uuid4().hex
|
|
data = json.dumps({'system_id': system_id},
|
|
sort_keys=True).encode('utf8')
|
|
try:
|
|
self.kazoo_client.create(SYSTEM_ROOT, data)
|
|
except NodeExistsError:
|
|
data, stat = self.kazoo_client.get(SYSTEM_ROOT)
|
|
|
|
self.system_id = json.loads(data.decode('utf8'))['system_id']
|