def send_heart_beat_msg_to_agent_service(status_event_type): response = None try: retry_count = 0 canRetry = True while retry_count <= 5 and canRetry: waagent.AddExtensionEvent(name=ExtensionShortName, op='HeartBeatInProgress', isSuccess=True, message="In send_heart_beat_msg_to_agent_service method") code,output = run_cmd("python /opt/microsoft/dsc/Scripts/GetDscLocalConfigurationManager.py") if code == 0 and "RefreshMode=Pull" in output: waagent.AddExtensionEvent(name=ExtensionShortName, op='HeartBeatInProgress', isSuccess=True, message="sends heartbeat message in pullmode") m = re.search("ServerURL=([^\n]+)", output) if not m: return registration_url = m.group(1) agent_id = get_nodeid(nodeid_path) node_extended_properties_url = registration_url + "/Nodes(AgentId='" + agent_id + "')/ExtendedProperties" waagent.AddExtensionEvent(name=ExtensionShortName, op='HeartBeatInProgress', isSuccess=True, message="Url is " + node_extended_properties_url) headers = {'Content-Type': "application/json; charset=utf-8", 'Accept': "application/json", "ProtocolVersion" : "2.0"} data = construct_node_extension_properties(output, status_event_type) http_client_factory = httpclientfactory.HttpClientFactory("/etc/opt/omi/ssl/oaas.crt", "/etc/opt/omi/ssl/oaas.key") http_client = http_client_factory.create_http_client(sys.version_info) response = http_client.post(node_extended_properties_url, headers=headers, data=data) waagent.AddExtensionEvent(name=ExtensionShortName, op='HeartBeatInProgress', isSuccess=True, message="response code is " + str(response.status_code)) if response.status_code >=500 and response.status_code < 600: canRetry = True time.sleep(10) else: canRetry = False retry_count += 1 except Exception as e: waagent.AddExtensionEvent(name=ExtensionShortName, op='HeartBeatInProgress', isSuccess=True, message="Failed to send heartbeat message to DSC agent service: {0}, stacktrace: {1} ".format(str(e), traceback.format_exc())) hutil.error('Failed to send heartbeat message to DSC agent service: %s, stack trace: %s' %(str(e), traceback.format_exc())) return response
def register(registration_endpoint, worker_group_name, machine_id, cert_path, key_path, is_azure_vm, vm_id, azure_resource_id, test_mode): """Registers the worker through the automation linked account with the Agent Service. Returns: The deserialized response from the Agent Service. """ http_client_factory = httpclientfactory.HttpClientFactory(cert_path, key_path, test_mode) http_client = http_client_factory.create_http_client(sys.version_info) no_proxy_http_client_factory = httpclientfactory.HttpClientFactory(cert_path, key_path, test_mode, force_no_proxy=True) no_proxy_http_client = no_proxy_http_client_factory.create_http_client(sys.version_info) headers, payload = get_headers_and_payload(worker_group_name, is_azure_vm, vm_id, azure_resource_id, cert_path, no_proxy_http_client) url = registration_endpoint + "/HybridV2(MachineId='" + machine_id + "')" response = http_client.put(url, headers=headers, data=payload) if response.status_code != 200: raise Exception("Unable to register [status_code=" + str(response.status_code) + "]") return json.loads(response.raw_data), payload
def deregister(registration_endpoint, worker_group_name, machine_id, cert_path, key_path, test_mode): """Deregisters the worker through the automation linked account with the Agent Service. Note: This method is only present for testing purposes for now. Linked account deregistration is not yet implemented and deregistration need to be made through using the automation account information. Returns: """ headers, payload = get_headers_and_payload(worker_group_name, certificate_path=cert_path) url = registration_endpoint + "/Hybrid(MachineId='" + machine_id + "')" http_client_factory = httpclientfactory.HttpClientFactory(cert_path, key_path, test_mode) http_client = http_client_factory.create_http_client(sys.version_info) response = http_client.delete(url, headers=headers, data=payload) if response.status_code != 200: raise Exception("Unable to deregister [status_code=" + str(response.status_code) + "]")