113 lines
2.9 KiB
Python
113 lines
2.9 KiB
Python
#
|
|
# Copyright (c) 2024 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
import argparse
|
|
import json
|
|
from oslo_log import log
|
|
import socket
|
|
|
|
import software.config as cfg
|
|
from software.messages import PATCHMSG_DEPLOY_STATE_CHANGED
|
|
|
|
|
|
LOG = log.getLogger(__name__)
|
|
MAX_RETRY = 3
|
|
RETRY_INTERVAL = 1
|
|
ACK_OK = "OK"
|
|
|
|
|
|
def get_udp_socket(server_addr, server_port):
|
|
addr = socket.getaddrinfo(server_addr, server_port)
|
|
if len(addr) > 0:
|
|
addr_family = addr[0][0]
|
|
else:
|
|
err = "Invalid server address (%s) or port (%s)" % \
|
|
(server_addr, server_port)
|
|
raise Exception(err)
|
|
|
|
sock = socket.socket(addr_family, socket.SOCK_DGRAM)
|
|
return sock
|
|
|
|
|
|
def update_deploy_state(server_addr, server_port, agent, deploy_state=None, host=None, host_state=None, timeout=1):
|
|
"""
|
|
Send MessageDeployStateChanged message to software-controller via
|
|
upd packet, wait for ack or raise exception.
|
|
The message is a serialized json object:
|
|
{
|
|
"msgtype": PATCHMSG_DEPLOY_STATE_CHANGED,
|
|
"msgversion": 1,
|
|
"agent": "<a valid agent>",
|
|
"deploy-state": "<deploy-state>",
|
|
"hostname": "<hostname>",
|
|
"host-state": "<host-deploy-substate>"
|
|
}
|
|
"""
|
|
|
|
msg = {
|
|
"msgtype": PATCHMSG_DEPLOY_STATE_CHANGED,
|
|
"msgversion": 1,
|
|
"agent": agent,
|
|
"deploy-state": deploy_state,
|
|
"hostname": host,
|
|
"host_state": host_state
|
|
}
|
|
|
|
msg_txt = json.dumps(msg)
|
|
|
|
sock = get_udp_socket(server_addr, server_port)
|
|
|
|
if timeout >= 0:
|
|
sock.settimeout(timeout)
|
|
|
|
resp = ""
|
|
|
|
for _ in range(MAX_RETRY):
|
|
sock.sendto(str.encode(msg_txt), (server_addr, server_port))
|
|
|
|
try:
|
|
resp = sock.recv(64).decode()
|
|
except socket.timeout:
|
|
LOG.warning("timeout %s sec expired for ack" % timeout)
|
|
else:
|
|
break
|
|
|
|
if resp != ACK_OK:
|
|
err = "%s failed updating deploy state %s %s %s" % \
|
|
(agent, deploy_state, host, host_state)
|
|
raise Exception(err)
|
|
|
|
|
|
def update_state():
|
|
# this is the entry point to update deploy state
|
|
|
|
parser = argparse.ArgumentParser(add_help=False)
|
|
|
|
parser.add_argument("agent",
|
|
default=False,
|
|
help="service agent")
|
|
|
|
parser.add_argument('-s', '--state',
|
|
default=False,
|
|
help="deploy state")
|
|
|
|
parser.add_argument('-h', '--host',
|
|
default=False,
|
|
help="host name")
|
|
|
|
parser.add_argument('-t', '--host_state',
|
|
default=False,
|
|
help="host state")
|
|
|
|
args = parser.parse_args()
|
|
|
|
server = "controller"
|
|
cfg.read_config()
|
|
server_port = cfg.controller_port
|
|
update_deploy_state(server, int(server_port), args.agent,
|
|
deploy_state=args.state,
|
|
host=args.host, host_state=args.host_state)
|