def single_variant_config(): config_resource_name = random_suffix_name("single-variant-config", 32) model_resource_name = config_resource_name + "-model" replacements = REPLACEMENT_VALUES.copy() replacements["CONFIG_NAME"] = config_resource_name replacements["MODEL_NAME"] = model_resource_name model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model", replacements=replacements, ) assert model_resource is not None config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_single_variant", replacements=replacements, ) assert config_resource is not None yield (config_reference, config_resource) k8s.delete_custom_resource(model_reference) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(config_reference): k8s.delete_custom_resource(config_reference)
def faulty_config(name_suffix, single_container_model): replacements = REPLACEMENT_VALUES.copy() # copy model data to a temp S3 location and delete it after model is created on SageMaker model_bucket = replacements["SAGEMAKER_DATA_BUCKET"] copy_source = { "Bucket": model_bucket, "Key": "sagemaker/model/xgboost-mnist-model.tar.gz", } model_destination_key = "sagemaker/model/delete/xgboost-mnist-model.tar.gz" s3.copy_object(model_bucket, copy_source, model_destination_key) model_resource_name = name_suffix + "faulty-model" replacements["MODEL_NAME"] = model_resource_name replacements[ "MODEL_LOCATION"] = f"s3://{model_bucket}/{model_destination_key}" model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=cfg.MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model_with_model_location", replacements=replacements, ) assert model_resource is not None if k8s.get_resource_arn(model_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {model_resource['status']}" ) assert k8s.get_resource_arn(model_resource) is not None s3.delete_object(model_bucket, model_destination_key) config_resource_name = name_suffix + "-faulty-config" (_, model_resource) = single_container_model model_resource_name = model_resource["spec"].get("modelName", None) replacements["ENDPOINT_CONFIG_NAME"] = config_resource_name config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_multi_variant", replacements=replacements, ) assert config_resource is not None if k8s.get_resource_arn(config_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {config_resource['status']}" ) assert k8s.get_resource_arn(config_resource) is not None yield (config_reference, config_resource) for cr in (model_reference, config_reference): _, deleted = k8s.delete_custom_resource(cr, 3, 10) assert deleted
def xgboost_churn_data_quality_monitoring_schedule( xgboost_churn_data_quality_job_definition, ): (_, job_definition_resource) = xgboost_churn_data_quality_job_definition job_definition_name = job_definition_resource["spec"].get("jobDefinitionName") monitoring_schedule_name = random_suffix_name("monitoring-schedule", 32) replacements = REPLACEMENT_VALUES.copy() replacements["MONITORING_SCHEDULE_NAME"] = monitoring_schedule_name replacements["JOB_DEFINITION_NAME"] = job_definition_name replacements["MONITORING_TYPE"] = "DataQuality" reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=monitoring_schedule_name, spec_file="monitoring_schedule_base", replacements=replacements, ) assert resource is not None yield (reference, resource, spec) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH) assert deleted
def xgboost_endpoint(name_suffix, single_variant_config): endpoint_resource_name = name_suffix (_, config_resource) = single_variant_config config_resource_name = config_resource["spec"].get("endpointConfigName", None) replacements = REPLACEMENT_VALUES.copy() replacements["ENDPOINT_NAME"] = endpoint_resource_name replacements["ENDPOINT_CONFIG_NAME"] = config_resource_name reference, spec, resource = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_RESOURCE_PLURAL, resource_name=endpoint_resource_name, spec_file="endpoint_base", replacements=replacements, ) assert resource is not None yield (reference, resource, spec) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): # longer wait incase endpoint is in creating/updating status _, deleted = k8s.delete_custom_resource(reference, 40, cfg.DELETE_WAIT_LENGTH) assert deleted
def xgboost_churn_data_quality_job_definition(xgboost_churn_endpoint): endpoint_spec = xgboost_churn_endpoint endpoint_name = endpoint_spec["spec"].get("endpointName") resource_name = random_suffix_name("data-quality-job-definition", 32) replacements = REPLACEMENT_VALUES.copy() replacements["JOB_DEFINITION_NAME"] = resource_name replacements["ENDPOINT_NAME"] = endpoint_name job_definition_reference, _, resource = create_sagemaker_resource( resource_plural=cfg.DATA_QUALITY_JOB_DEFINITION_RESOURCE_PLURAL, resource_name=resource_name, spec_file="data_quality_job_definition_xgboost_churn", replacements=replacements, ) assert resource is not None job_definition_name = resource["spec"].get("jobDefinitionName") yield (job_definition_reference, resource) if k8s.get_resource_exists(job_definition_reference): _, deleted = k8s.delete_custom_resource(job_definition_reference, 3, 10) assert deleted
def xgboost_training_job(): resource_name = random_suffix_name("xgboost-trainingjob", 32) replacements = REPLACEMENT_VALUES.copy() replacements["TRAINING_JOB_NAME"] = resource_name reference, _, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_trainingjob", replacements=replacements, ) assert resource is not None if k8s.get_resource_arn(resource) is None: logging.error( f"ARN for this resource is None, resource status is: {resource['status']}" ) assert k8s.get_resource_arn(resource) is not None yield (reference, resource) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, cfg.JOB_DELETE_WAIT_PERIODS, cfg.JOB_DELETE_WAIT_LENGTH) assert deleted
def xgboost_model_package_group(): resource_name = random_suffix_name("xgboost-model-package-group", 38) replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_PACKAGE_GROUP_NAME"] = resource_name ( model_package_group_reference, model_package_group_spec, model_package_group_resource, ) = create_sagemaker_resource( resource_plural=cfg.MODEL_PACKAGE_GROUP_RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_model_package_group", replacements=replacements, ) assert model_package_group_resource is not None if k8s.get_resource_arn(model_package_group_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {model_package_group_resource['status']}" ) assert k8s.get_resource_arn(model_package_group_resource) is not None yield (model_package_group_reference, model_package_group_resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(model_package_group_reference): _, deleted = k8s.delete_custom_resource(model_package_group_reference, DELETE_WAIT_PERIOD, DELETE_WAIT_LENGTH) assert deleted
def multi_variant_config(name_suffix, single_container_model): config_resource_name = name_suffix + "-multi-variant-config" (_, model_resource) = single_container_model model_resource_name = model_resource["spec"].get("modelName", None) replacements = REPLACEMENT_VALUES.copy() replacements["ENDPOINT_CONFIG_NAME"] = config_resource_name replacements["MODEL_NAME"] = model_resource_name config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_multi_variant", replacements=replacements, ) assert config_resource is not None if k8s.get_resource_arn(config_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {config_resource['status']}" ) assert k8s.get_resource_arn(config_resource) is not None yield (config_reference, config_resource) _, deleted = k8s.delete_custom_resource(config_reference, 3, 10) assert deleted
def xgboost_transformjob(xgboost_model_for_transform): (transform_resource_name, model_resource_name) = xgboost_model_for_transform replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_NAME"] = model_resource_name replacements["TRANSFORM_JOB_NAME"] = transform_resource_name reference, _, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=transform_resource_name, spec_file="xgboost_transformjob", replacements=replacements, ) assert resource is not None if k8s.get_resource_arn(resource) is None: logging.error( f"ARN for this resource is None, resource status is: {resource['status']}" ) assert k8s.get_resource_arn(resource) is not None yield (reference, resource) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, cfg.JOB_DELETE_WAIT_PERIODS, cfg.JOB_DELETE_WAIT_LENGTH) assert deleted
def faulty_config(name_suffix, single_container_model): replacements = REPLACEMENT_VALUES.copy() # copy model data to a temp S3 location and delete it after model is created on SageMaker model_bucket = replacements["SAGEMAKER_DATA_BUCKET"] copy_source = { "Bucket": model_bucket, "Key": "sagemaker/model/xgboost-mnist-model.tar.gz", } model_destination_key = "sagemaker/model/delete/xgboost-mnist-model.tar.gz" s3.copy_object(model_bucket, copy_source, model_destination_key) model_resource_name = name_suffix + "faulty-model" replacements["MODEL_NAME"] = model_resource_name replacements[ "MODEL_LOCATION"] = f"s3://{model_bucket}/{model_destination_key}" model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model_with_model_location", replacements=replacements, ) assert model_resource is not None model_resource = k8s.get_resource(model_reference) assert ("ackResourceMetadata" in model_resource["status"] and "arn" in model_resource["status"]["ackResourceMetadata"]) s3.delete_object(model_bucket, model_destination_key) config_resource_name = name_suffix + "-faulty-config" (_, model_resource) = single_container_model model_resource_name = model_resource["spec"].get("modelName", None) replacements["CONFIG_NAME"] = config_resource_name config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_multi_variant", replacements=replacements, ) assert config_resource is not None yield (config_reference, config_resource) k8s.delete_custom_resource(model_reference) k8s.delete_custom_resource(config_reference)
def apply_app_yaml(domain_id, user_profile_name): replacements = REPLACEMENT_VALUES.copy() replacements["DOMAIN_ID"] = domain_id replacements["USER_PROFILE_NAME"] = user_profile_name reference, spec, resource = create_sagemaker_resource( resource_plural="apps", resource_name="default", spec_file="app", replacements=replacements, ) return reference, resource, spec
def apply_user_profile_yaml(resource_name, domain_id): replacements = REPLACEMENT_VALUES.copy() replacements["USER_PROFILE_NAME"] = resource_name replacements["DOMAIN_ID"] = domain_id reference, spec, resource = create_sagemaker_resource( resource_plural="userprofiles", resource_name=resource_name, spec_file="user_profile", replacements=replacements, ) return reference, resource, spec
def apply_domain_yaml(resource_name): replacements = REPLACEMENT_VALUES.copy() replacements["DOMAIN_NAME"] = resource_name replacements["VPC_ID"] = get_default_vpc() replacements["SUBNET_ID"] = get_subnet(replacements["VPC_ID"]) reference, spec, resource = create_sagemaker_resource( resource_plural="domains", resource_name=resource_name, spec_file="domain", replacements=replacements, ) return reference, resource, spec
def single_variant_config(): config_resource_name = random_suffix_name("single-variant-config", 32) model_resource_name = config_resource_name + "-model" replacements = REPLACEMENT_VALUES.copy() replacements["ENDPOINT_CONFIG_NAME"] = config_resource_name replacements["MODEL_NAME"] = model_resource_name model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=cfg.MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model", replacements=replacements, ) assert model_resource is not None if k8s.get_resource_arn(model_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {model_resource['status']}" ) assert k8s.get_resource_arn(model_resource) is not None config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_single_variant", replacements=replacements, ) assert config_resource is not None yield (config_reference, config_resource) k8s.delete_custom_resource(model_reference, 3, 10) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(config_reference): _, deleted = k8s.delete_custom_resource(config_reference, 3, 10) assert deleted
def single_container_model(name_suffix): model_resource_name = name_suffix + "-model" replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_NAME"] = model_resource_name model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model", replacements=replacements, ) assert model_resource is not None yield (model_reference, model_resource) k8s.delete_custom_resource(model_reference)
def notebook_instance_lifecycleConfig(): notebook_instance_lfc_name = random_suffix_name("notebookinstancelfc", 50) replacements = REPLACEMENT_VALUES.copy() replacements["NOTEBOOK_INSTANCE_LFC_NAME"] = notebook_instance_lfc_name reference, spec, resource = create_sagemaker_resource( resource_plural="notebookinstancelifecycleconfigs", resource_name=notebook_instance_lfc_name, spec_file="notebook_instance_lifecycle_config", replacements=replacements, ) assert resource is not None yield (reference, resource, spec) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, DELETE_WAIT_PERIOD, DELETE_PERIOD_LENGTH) assert deleted
def xgboost_training_job_debugger(): resource_name = random_suffix_name("xgboost-trainingjob-debugger", 50) replacements = REPLACEMENT_VALUES.copy() replacements["TRAINING_JOB_NAME"] = resource_name reference, _, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_trainingjob_debugger", replacements=replacements, ) assert resource is not None yield (reference, resource) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, 3, 10) assert deleted
def xgboost_transformjob(sagemaker_client): # Create model using boto3 for TransformJob transform_model_file = ( f"s3://{get_bootstrap_resources().DataBucketName}/sagemaker/batch/model.tar.gz" ) model_name = random_suffix_name("xgboost-model", 32) create_response = sagemaker_client.create_model( ModelName=model_name, PrimaryContainer={ "Image": REPLACEMENT_VALUES["XGBOOST_IMAGE_URI"], "ModelDataUrl": transform_model_file, "Environment": {}, }, ExecutionRoleArn=REPLACEMENT_VALUES["SAGEMAKER_EXECUTION_ROLE_ARN"], ) logging.debug(create_response) # Check if the model is created successfully describe_model_response = sagemaker_client.describe_model( ModelName=model_name) assert describe_model_response["ModelName"] is not None resource_name = random_suffix_name("xgboost-transformjob", 32) # Use the model created above replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_NAME"] = model_name replacements["TRANSFORM_JOB_NAME"] = resource_name reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_transformjob", replacements=replacements, ) assert resource is not None yield (reference, resource) # Delete the model created sagemaker_client.delete_model(ModelName=model_name) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): k8s.delete_custom_resource(reference)
def xgboost_hpojob(): resource_name = random_suffix_name("xgboost-hpojob", 32) replacements = REPLACEMENT_VALUES.copy() replacements["HPO_JOB_NAME"] = resource_name reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_hpojob", replacements=replacements, ) assert resource is not None yield (reference, resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): k8s.delete_custom_resource(reference)
def feature_group(): """Creates a feature group from a SPEC_FILE.""" feature_group_name = random_suffix_name(RESOURCE_NAME_PREFIX, 32) replacements = REPLACEMENT_VALUES.copy() replacements["FEATURE_GROUP_NAME"] = feature_group_name reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=feature_group_name, spec_file=SPEC_FILE, replacements=replacements, ) assert resource is not None yield (reference, resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, WAIT_PERIOD_COUNT, WAIT_PERIOD_LENGTH) assert deleted
def xgboost_unversioned_model_package(): resource_name = random_suffix_name("xgboost-unversioned-model-package", 38) replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_PACKAGE_NAME"] = resource_name reference, _, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_unversioned_model_package", replacements=replacements, ) assert resource is not None yield (reference, resource) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, DELETE_WAIT_PERIOD, DELETE_WAIT_LENGTH) assert deleted
def single_variant_config(name_suffix, single_container_model): config_resource_name = name_suffix + "-single-variant-config" (_, model_resource) = single_container_model model_resource_name = model_resource["spec"].get("modelName", None) replacements = REPLACEMENT_VALUES.copy() replacements["CONFIG_NAME"] = config_resource_name replacements["MODEL_NAME"] = model_resource_name config_reference, config_spec, config_resource = create_sagemaker_resource( resource_plural=CONFIG_RESOURCE_PLURAL, resource_name=config_resource_name, spec_file="endpoint_config_single_variant", replacements=replacements, ) assert config_resource is not None yield (config_reference, config_resource) k8s.delete_custom_resource(config_reference)
def notebook_instance(): default_code_repository = "https://github.com/aws-controllers-k8s/community" resource_name = random_suffix_name("nb", 32) replacements = REPLACEMENT_VALUES.copy() replacements["NOTEBOOK_INSTANCE_NAME"] = resource_name replacements["DEFAULT_CODE_REPOSITORY"] = default_code_repository reference, spec, resource = create_sagemaker_resource( resource_plural="notebookinstances", resource_name=resource_name, spec_file="notebook_instance", replacements=replacements, ) assert resource is not None yield (reference, resource, spec) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, DELETE_WAIT_PERIOD, DELETE_WAIT_LENGTH) assert deleted
def xgboost_model_package_group(): resource_name = random_suffix_name("xgboost-model-package-group", 50) replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_PACKAGE_GROUP_NAME"] = resource_name reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_model_package_group", replacements=replacements, ) assert resource is not None yield (reference, resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH) assert deleted
def single_container_model(name_suffix): model_resource_name = name_suffix + "-model" replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_NAME"] = model_resource_name model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=cfg.MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model", replacements=replacements, ) assert model_resource is not None if k8s.get_resource_arn(model_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {model_resource['status']}" ) assert k8s.get_resource_arn(model_resource) is not None yield (model_reference, model_resource) _, deleted = k8s.delete_custom_resource(model_reference, 3, 10) assert deleted
def xgboost_churn_model_bias_job_definition(xgboost_churn_endpoint): endpoint_spec = xgboost_churn_endpoint endpoint_name = endpoint_spec["spec"].get("endpointName") job_definition_name = random_suffix_name("model-bias-job-definition", 32) replacements = REPLACEMENT_VALUES.copy() replacements["JOB_DEFINITION_NAME"] = job_definition_name replacements["ENDPOINT_NAME"] = endpoint_name reference, _, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=job_definition_name, spec_file="model_bias_job_definition_xgboost_churn", replacements=replacements, ) assert resource is not None yield (reference, resource) if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, 3, 10) assert deleted
def cross_region_model(): resource_name = random_suffix_name("cross-region-model", 32) region = get_cross_region() replacements = REPLACEMENT_VALUES.copy() replacements["MODEL_NAME"] = resource_name replacements["REGION"] = region replacements[ "XGBOOST_V1_IMAGE_URI"] = f"{XGBOOST_V1_IMAGE_URIS[region]}/xgboost:latest" reference, spec, resource = create_sagemaker_resource( resource_plural=cfg.MODEL_RESOURCE_PLURAL, resource_name=resource_name, spec_file="cross_region_model", replacements=replacements, ) assert resource is not None yield (reference, resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, 3, 10) assert deleted
def xgboost_versioned_model_package(xgboost_model_package_group): resource_name = random_suffix_name("xgboost-versioned-model-package", 38) (_, model_package_group_resource) = xgboost_model_package_group model_package_group_resource_name = model_package_group_resource[ "spec"].get("modelPackageGroupName", None) replacements = REPLACEMENT_VALUES.copy() replacements[ "MODEL_PACKAGE_GROUP_NAME"] = model_package_group_resource_name replacements["MODEL_PACKAGE_RESOURCE_NAME"] = resource_name reference, spec, resource = create_sagemaker_resource( resource_plural=RESOURCE_PLURAL, resource_name=resource_name, spec_file="xgboost_versioned_model_package", replacements=replacements, ) assert resource is not None yield (reference, spec, resource) # Delete the k8s resource if not already deleted by tests if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, DELETE_WAIT_PERIOD, DELETE_WAIT_LENGTH) assert deleted
def xgboost_churn_endpoint(sagemaker_client): """Creates a SageMaker endpoint with the XGBoost churn single-variant model and data capture enabled. """ endpoint_resource_name = random_suffix_name("xgboost-churn", 32) endpoint_config_resource_name = endpoint_resource_name + "-config" model_resource_name = endpoint_config_resource_name + "-model" replacements = REPLACEMENT_VALUES.copy() replacements["ENDPOINT_NAME"] = endpoint_resource_name replacements["ENDPOINT_CONFIG_NAME"] = endpoint_config_resource_name replacements["MODEL_NAME"] = model_resource_name data_bucket = replacements["SAGEMAKER_DATA_BUCKET"] replacements[ "MODEL_LOCATION"] = f"s3://{data_bucket}/sagemaker/model/xgb-churn-prediction-model.tar.gz" model_reference, model_spec, model_resource = create_sagemaker_resource( resource_plural=cfg.MODEL_RESOURCE_PLURAL, resource_name=model_resource_name, spec_file="xgboost_model_with_model_location", replacements=replacements, ) assert model_resource is not None if k8s.get_resource_arn(model_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {model_resource['status']}" ) assert k8s.get_resource_arn(model_resource) is not None ( endpoint_config_reference, endpoint_config_spec, endpoint_config_resource, ) = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_CONFIG_RESOURCE_PLURAL, resource_name=endpoint_config_resource_name, spec_file="endpoint_config_data_capture_single_variant", replacements=replacements, ) assert endpoint_config_resource is not None if k8s.get_resource_arn(endpoint_config_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {endpoint_config_resource['status']}" ) assert k8s.get_resource_arn(endpoint_config_resource) is not None endpoint_reference, endpoint_spec, endpoint_resource = create_sagemaker_resource( resource_plural=cfg.ENDPOINT_RESOURCE_PLURAL, resource_name=endpoint_resource_name, spec_file="endpoint_base", replacements=replacements, ) assert endpoint_resource is not None if k8s.get_resource_arn(endpoint_resource) is None: logging.error( f"ARN for this resource is None, resource status is: {endpoint_resource['status']}" ) assert k8s.get_resource_arn(endpoint_resource) is not None wait_sagemaker_endpoint_status(replacements["ENDPOINT_NAME"], "InService") yield endpoint_spec for cr in (model_reference, endpoint_config_reference, endpoint_reference): _, deleted = k8s.delete_custom_resource(cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH) assert deleted