def Update()

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)