in src/k8s-extension/azext_k8s_extension/partner_extensions/AzureMLKubernetes.py [0:0]
def Update(self, cmd, resource_group_name, cluster_name, auto_upgrade_minor_version, release_train, version, configuration_settings,
configuration_protected_settings, original_extension, yes=False):
logger.warning("Troubleshooting: {}".format(self.TSG_LINK))
input_configuration_settings = copy.deepcopy(configuration_settings)
input_configuration_protected_settings = copy.deepcopy(configuration_protected_settings)
# configuration_settings and configuration_protected_settings can be none, so need to set them to empty dict
if configuration_settings is None:
configuration_settings = {}
if configuration_protected_settings is None:
configuration_protected_settings = {}
self.__normalize_config(configuration_settings, configuration_protected_settings)
# Prompt message to ask customer to confirm again
if len(configuration_settings) > 0:
impactScenario = ""
messageBody = ""
disableTraining = False
disableInference = False
disableNvidiaDevicePlugin = False
hasAllowInsecureConnections = False
hasInferenceRouterServiceType = False
hasInternalLoadBalancerProvider = False
hasSslCname = False
hasNodeSelector = False
enableLogAnalyticsWS = False
enableTraining = _get_value_from_config_protected_config(self.ENABLE_TRAINING, configuration_settings, configuration_protected_settings)
if enableTraining is not None:
disableTraining = str(enableTraining).lower() == 'false'
if disableTraining:
messageBody = messageBody + "enableTraining from True to False,\n"
enableInference = _get_value_from_config_protected_config(self.ENABLE_INFERENCE, configuration_settings, configuration_protected_settings)
if enableInference is not None:
disableInference = str(enableInference).lower() == 'false'
if disableInference:
messageBody = messageBody + "enableInference from True to False,\n"
installNvidiaDevicePlugin = _get_value_from_config_protected_config(self.installNvidiaDevicePlugin, configuration_settings, configuration_protected_settings)
if installNvidiaDevicePlugin is not None:
disableNvidiaDevicePlugin = str(installNvidiaDevicePlugin).lower() == 'false'
if disableNvidiaDevicePlugin:
messageBody = messageBody + "installNvidiaDevicePlugin from True to False if Nvidia GPU is used,\n"
allowInsecureConnections = _get_value_from_config_protected_config(self.allowInsecureConnections, configuration_settings, configuration_protected_settings)
if allowInsecureConnections is not None:
hasAllowInsecureConnections = True
messageBody = messageBody + "allowInsecureConnections\n"
inferenceRouterServiceType = _get_value_from_config_protected_config(self.inferenceRouterServiceType, configuration_settings, configuration_protected_settings)
if inferenceRouterServiceType is not None:
hasInferenceRouterServiceType = True
messageBody = messageBody + "inferenceRouterServiceType\n"
internalLoadBalancerProvider = _get_value_from_config_protected_config(self.internalLoadBalancerProvider, configuration_settings, configuration_protected_settings)
if internalLoadBalancerProvider is not None:
hasInternalLoadBalancerProvider = True
messageBody = messageBody + "internalLoadBalancerProvider\n"
sslCname = _get_value_from_config_protected_config(self.SSL_Cname, configuration_settings, configuration_protected_settings)
if sslCname is not None:
hasSslCname = True
messageBody = messageBody + "sslCname\n"
hasNodeSelector = _check_nodeselector_existed(configuration_settings, configuration_protected_settings)
if hasNodeSelector:
messageBody = messageBody + "nodeSelector. Update operation can't remove an existed node selector, but can update or add new ones.\n"
logAnalyticsWS = _get_value_from_config_protected_config(self.LOG_ANALYTICS_WS_ENABLED, configuration_settings, configuration_protected_settings)
if logAnalyticsWS is not None:
enableLogAnalyticsWS = str(logAnalyticsWS).lower() == 'true'
if enableLogAnalyticsWS:
messageBody = messageBody + "To update logAnalyticsWS from False to True, please provide all original configurationProtectedSettings. Otherwise, those settings would be considered obsolete and deleted.\n"
if disableTraining or disableNvidiaDevicePlugin or hasNodeSelector:
impactScenario = "jobs"
if disableInference or disableNvidiaDevicePlugin or hasAllowInsecureConnections or hasInferenceRouterServiceType or hasInternalLoadBalancerProvider or hasNodeSelector or hasSslCname:
if impactScenario == "":
impactScenario = "online endpoints and deployments"
else:
impactScenario = impactScenario + ", online endpoints and deployments"
if impactScenario != "":
message = ("\nThe following configuration update will IMPACT your active Machine Learning " + impactScenario +
". It will be the safe update if the cluster doesn't have active Machine Learning " + impactScenario + ".\n\n" + messageBody + "\nProceed?")
user_confirmation_factory(cmd, yes, message=message)
else:
if enableLogAnalyticsWS:
message = "\n" + messageBody + "\nProceed?"
user_confirmation_factory(cmd, yes, message=message)
if len(configuration_protected_settings) > 0:
subscription_id = get_subscription_id(cmd.cli_ctx)
if self.AZURE_LOG_ANALYTICS_CONNECTION_STRING not in configuration_protected_settings:
try:
_, shared_key = _get_log_analytics_ws_connection_string(
cmd, subscription_id, resource_group_name, cluster_name, '', True)
configuration_protected_settings[self.AZURE_LOG_ANALYTICS_CONNECTION_STRING] = shared_key
logger.info("Get log analytics connection string succeeded.")
except HttpResponseError:
logger.info("Failed to get log analytics connection string.")
original_extension_config_settings = original_extension.configuration_settings
if original_extension_config_settings is None:
original_extension_config_settings = {}
if original_extension_config_settings.get(self.RELAY_SERVER_ENABLED).lower() != 'false' \
and self.RELAY_SERVER_CONNECTION_STRING not in configuration_protected_settings:
try:
relay_connection_string, _, _ = _get_relay_connection_str(
cmd, subscription_id, resource_group_name, cluster_name, '', self.RELAY_HC_AUTH_NAME, True)
configuration_protected_settings[self.RELAY_SERVER_CONNECTION_STRING] = relay_connection_string
logger.info("Get relay connection string succeeded.")
except HttpResponseError as ex:
if ex.response.status_code == 404:
raise ResourceNotFoundError("Relay server not found. "
"Check {} for more information.".format(self.TSG_LINK)) from ex
raise AzureResponseError("Failed to get relay connection string."
"Check {} for more information.".format(self.TSG_LINK)) from ex
if original_extension_config_settings.get(self.SERVICE_BUS_ENABLED).lower() != 'false' \
and self.SERVICE_BUS_CONNECTION_STRING not in configuration_protected_settings:
try:
service_bus_connection_string, _ = _get_service_bus_connection_string(
cmd, subscription_id, resource_group_name, cluster_name, '', {}, True)
configuration_protected_settings[self.SERVICE_BUS_CONNECTION_STRING] = service_bus_connection_string
logger.info("Get service bus connection string succeeded.")
except HttpResponseError as ex:
if ex.response.status_code == 404:
raise ResourceNotFoundError("Service bus not found."
"Check {} for more information.".format(self.TSG_LINK)) from ex
raise AzureResponseError("Failed to get service bus connection string."
"Check {} for more information.".format(self.TSG_LINK)) from ex
configuration_protected_settings = _dereference(self.reference_mapping, configuration_protected_settings)
fe_ssl_secret = _get_value_from_config_protected_config(
self.SSL_SECRET, configuration_settings, configuration_protected_settings)
fe_ssl_cert_file = configuration_protected_settings.get(self.sslCertPemFile)
fe_ssl_key_file = configuration_protected_settings.get(self.sslKeyPemFile)
# always take ssl key/cert first, then secret if key/cert file is not provided
if fe_ssl_cert_file and fe_ssl_key_file:
logger.info(f"Both {self.sslKeyPemFile} and {self.sslCertPemFile} are set, updating ssl key.")
self.__set_inference_ssl_from_file(configuration_protected_settings, fe_ssl_cert_file, fe_ssl_key_file)
elif fe_ssl_secret:
logger.info(f"{self.SSL_SECRET} is set, updating ssl secret.")
self.__set_inference_ssl_from_secret(configuration_settings, fe_ssl_secret)
# if no entries are existed in configuration_protected_settings, configuration_settings, return whatever passed
# in the Update function(empty dict or None).
if len(configuration_settings) == 0:
configuration_settings = input_configuration_settings
if len(configuration_protected_settings) == 0:
configuration_protected_settings = input_configuration_protected_settings
return PatchExtension(auto_upgrade_minor_version=auto_upgrade_minor_version,
release_train=release_train,
version=version,
configuration_settings=configuration_settings,
configuration_protected_settings=configuration_protected_settings)