// Code generated by smithy-go-codegen DO NOT EDIT.

package rds

import (
	"context"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/aws-sdk-go-v2/service/rds/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
	"time"
)

// Creates a custom DB engine version (CEV). A CEV is a binary volume snapshot of a
// database engine and specific AMI. The supported engines are the following:
//
// *
// Oracle Database 12.1 Enterprise Edition with the January 2021 or later RU/RUR
//
// *
// Oracle Database 19c Enterprise Edition with the January 2021 or later
// RU/RUR
//
// Amazon RDS, which is a fully managed service, supplies the Amazon
// Machine Image (AMI) and database software. The Amazon RDS database software is
// preinstalled, so you need only select a DB engine and version, and create your
// database. With Amazon RDS Custom for Oracle, you upload your database
// installation files in Amazon S3. When you create a custom engine version, you
// specify the files in a JSON document called a CEV manifest. This document
// describes installation .zip files stored in Amazon S3. RDS Custom creates your
// CEV from the installation files that you provided. This service model is called
// Bring Your Own Media (BYOM). Creation takes approximately two hours. If creation
// fails, RDS Custom issues RDS-EVENT-0196 with the message Creation failed for
// custom engine version, and includes details about the failure. For example, the
// event prints missing files. After you create the CEV, it is available for use.
// You can create multiple CEVs, and create multiple RDS Custom instances from any
// CEV. You can also change the status of a CEV to make it available or inactive.
// The MediaImport service that imports files from Amazon S3 to create CEVs isn't
// integrated with Amazon Web Services CloudTrail. If you turn on data logging for
// Amazon RDS in CloudTrail, calls to the CreateCustomDbEngineVersion event aren't
// logged. However, you might see calls from the API gateway that accesses your
// Amazon S3 bucket. These calls originate from the MediaImport service for the
// CreateCustomDbEngineVersion event. For more information, see  Creating a CEV
// (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-cev.html#custom-cev.create)
// in the Amazon RDS User Guide.
func (c *Client) CreateCustomDBEngineVersion(ctx context.Context, params *CreateCustomDBEngineVersionInput, optFns ...func(*Options)) (*CreateCustomDBEngineVersionOutput, error) {
	if params == nil {
		params = &CreateCustomDBEngineVersionInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "CreateCustomDBEngineVersion", params, optFns, c.addOperationCreateCustomDBEngineVersionMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*CreateCustomDBEngineVersionOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type CreateCustomDBEngineVersionInput struct {

	// The name of an Amazon S3 bucket that contains database installation files for
	// your CEV. For example, a valid bucket name is my-custom-installation-files.
	//
	// This member is required.
	DatabaseInstallationFilesS3BucketName *string

	// The database engine to use for your custom engine version (CEV). The only
	// supported value is custom-oracle-ee.
	//
	// This member is required.
	Engine *string

	// The name of your CEV. The name format is 19.customized_string . For example, a
	// valid name is 19.my_cev1. This setting is required for RDS Custom for Oracle,
	// but optional for Amazon RDS. The combination of Engine and EngineVersion is
	// unique per customer per Region.
	//
	// This member is required.
	EngineVersion *string

	// The Amazon Web Services KMS key identifier for an encrypted CEV. A symmetric
	// encryption KMS key is required for RDS Custom, but optional for Amazon RDS. If
	// you have an existing symmetric encryption KMS key in your account, you can use
	// it with RDS Custom. No further action is necessary. If you don't already have a
	// symmetric encryption KMS key in your account, follow the instructions in
	// Creating a symmetric encryption KMS key
	// (https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)
	// in the Amazon Web Services Key Management Service Developer Guide. You can
	// choose the same symmetric encryption key when you create a CEV and a DB
	// instance, or choose different keys.
	//
	// This member is required.
	KMSKeyId *string

	// The CEV manifest, which is a JSON document that describes the installation .zip
	// files stored in Amazon S3. Specify the name/value pairs in a file or a quoted
	// string. RDS Custom applies the patches in the order in which they are listed.
	// The following JSON fields are valid: MediaImportTemplateVersion Version of the
	// CEV manifest. The date is in the format YYYY-MM-DD.
	// databaseInstallationFileNames Ordered list of installation files for the CEV.
	// opatchFileNames Ordered list of OPatch installers used for the Oracle DB engine.
	// psuRuPatchFileNames The PSU and RU patches for this CEV. OtherPatchFileNames The
	// patches that are not in the list of PSU and RU patches. Amazon RDS applies these
	// patches after applying the PSU and RU patches. For more information, see
	// Creating the CEV manifest
	// (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-cev.html#custom-cev.preparing.manifest)
	// in the Amazon RDS User Guide.
	//
	// This member is required.
	Manifest *string

	// The Amazon S3 directory that contains the database installation files for your
	// CEV. For example, a valid bucket name is 123456789012/cev1. If this setting
	// isn't specified, no prefix is assumed.
	DatabaseInstallationFilesS3Prefix *string

	// An optional description of your CEV.
	Description *string

	// A list of tags. For more information, see Tagging Amazon RDS Resources
	// (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) in
	// the Amazon RDS User Guide.
	Tags []types.Tag

	noSmithyDocumentSerde
}

// This data type is used as a response element in the action
// DescribeDBEngineVersions.
type CreateCustomDBEngineVersionOutput struct {

	// The creation time of the DB engine version.
	CreateTime *time.Time

	// The description of the database engine.
	DBEngineDescription *string

	// The ARN of the custom engine version.
	DBEngineVersionArn *string

	// The description of the database engine version.
	DBEngineVersionDescription *string

	// The name of the DB parameter group family for the database engine.
	DBParameterGroupFamily *string

	// The name of the Amazon S3 bucket that contains your database installation files.
	DatabaseInstallationFilesS3BucketName *string

	// The Amazon S3 directory that contains the database installation files. If not
	// specified, then no prefix is assumed.
	DatabaseInstallationFilesS3Prefix *string

	// The default character set for new instances of this engine version, if the
	// CharacterSetName parameter of the CreateDBInstance API isn't specified.
	DefaultCharacterSet *types.CharacterSet

	// The name of the database engine.
	Engine *string

	// The version number of the database engine.
	EngineVersion *string

	// The types of logs that the database engine has available for export to
	// CloudWatch Logs.
	ExportableLogTypes []string

	// The Amazon Web Services KMS key identifier for an encrypted CEV. This parameter
	// is required for RDS Custom, but optional for Amazon RDS.
	KMSKeyId *string

	// The major engine version of the CEV.
	MajorEngineVersion *string

	// The status of the DB engine version, either available or deprecated.
	Status *string

	// A list of the character sets supported by this engine for the CharacterSetName
	// parameter of the CreateDBInstance operation.
	SupportedCharacterSets []types.CharacterSet

	// A list of the supported DB engine modes.
	SupportedEngineModes []string

	// A list of features supported by the DB engine. The supported features vary by DB
	// engine and DB engine version. To determine the supported features for a specific
	// DB engine and DB engine version using the CLI, use the following command: aws
	// rds describe-db-engine-versions --engine --engine-version  For example, to
	// determine the supported features for RDS for PostgreSQL version 13.3 using the
	// CLI, use the following command: aws rds describe-db-engine-versions --engine
	// postgres --engine-version 13.3 The supported features are listed under
	// SupportedFeatureNames in the output.
	SupportedFeatureNames []string

	// A list of the character sets supported by the Oracle DB engine for the
	// NcharCharacterSetName parameter of the CreateDBInstance operation.
	SupportedNcharCharacterSets []types.CharacterSet

	// A list of the time zones supported by this engine for the Timezone parameter of
	// the CreateDBInstance action.
	SupportedTimezones []types.Timezone

	// A value that indicates whether the engine version supports Babelfish for Aurora
	// PostgreSQL.
	SupportsBabelfish bool

	// A value that indicates whether you can use Aurora global databases with a
	// specific DB engine version.
	SupportsGlobalDatabases bool

	// A value that indicates whether the engine version supports exporting the log
	// types specified by ExportableLogTypes to CloudWatch Logs.
	SupportsLogExportsToCloudwatchLogs bool

	// A value that indicates whether you can use Aurora parallel query with a specific
	// DB engine version.
	SupportsParallelQuery bool

	// Indicates whether the database engine version supports read replicas.
	SupportsReadReplica bool

	// A list of tags. For more information, see Tagging Amazon RDS Resources
	// (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) in
	// the Amazon RDS User Guide.
	TagList []types.Tag

	// A list of engine versions that this database engine version can be upgraded to.
	ValidUpgradeTarget []types.UpgradeTarget

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationCreateCustomDBEngineVersionMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsquery_serializeOpCreateCustomDBEngineVersion{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsquery_deserializeOpCreateCustomDBEngineVersion{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addClientUserAgent(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpCreateCustomDBEngineVersionValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateCustomDBEngineVersion(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opCreateCustomDBEngineVersion(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "rds",
		OperationName: "CreateCustomDBEngineVersion",
	}
}
