pkg/api/deploymentapi/depresourceapi/new_payload.go (142 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package depresourceapi import ( "io" "github.com/elastic/cloud-sdk-go/pkg/api" "github.com/elastic/cloud-sdk-go/pkg/api/deploymentapi/deptemplateapi" "github.com/elastic/cloud-sdk-go/pkg/models" ) // InstanceParams holds the common instance fields for a resource type InstanceParams struct { Size int32 ZoneCount int32 RefID string } // NewPayloadParams is consumed by NewPayload() type NewPayloadParams struct { *api.API // Optional deployment name Name string // Optional Elastic Stack version, Latest version will be used if empty. Version string // Required deployment template ID to use to create the deployment. DeploymentTemplateID string // Required region where the deployment will be created. Region string // Optionally enable an APM instance. ApmEnable bool // Optionally enable an AppSearch instance. AppsearchEnable bool // Optionally enable an Enterprise Search instance. EnterpriseSearchEnable bool // Optional io.Writer where notices will be written. Writer io.Writer // Optional Elasticsearch plug-ins to be enabled. Plugins []string // Optional Elasticsearch Topology Elements to compose a complex multi- // topology Elasticsearch cluster. Required when ElasticsearchInstance is // empty. TopologyElements []string // Optional ElasticsearchInstance template for single topology element // Elasticsearch clusters. ElasticsearchInstance InstanceParams // Required KibanaInstance template for the Kibana instance. KibanaInstance InstanceParams // Optional ApmInstance unless AppsearchEnable is set. ApmInstance InstanceParams // Optional AppsearchInstance unless AppsearchEnable is set. AppsearchInstance InstanceParams // Optional EnterpriseSearchInstance unless EnterpriseSearchEnable is set. EnterpriseSearchInstance InstanceParams } // NewPayload creates the payload for a deployment // // * Auto-discovers the latest Stack version if Version is not specified. func NewPayload(params NewPayloadParams) (*models.DeploymentCreateRequest, error) { res, err := deptemplateapi.Get(deptemplateapi.GetParams{ API: params.API, TemplateID: params.DeploymentTemplateID, Region: params.Region, }) if err != nil { return nil, err } // Version Discovery version, err := LatestStackVersion(LatestStackVersionParams{ Writer: params.Writer, API: params.API, Version: params.Version, Region: params.Region, }) if err != nil { return nil, err } esPayload, err := ParseElasticsearchInput(ParseElasticsearchInputParams{ NewElasticsearchParams: NewElasticsearchParams{ RefID: params.ElasticsearchInstance.RefID, Version: version, Plugins: params.Plugins, Region: params.Region, TemplateID: params.DeploymentTemplateID, DeploymentTemplateInfoV2: res, }, API: params.API, Size: params.ElasticsearchInstance.Size, ZoneCount: params.ElasticsearchInstance.ZoneCount, Writer: params.Writer, TopologyElements: params.TopologyElements, }) if err != nil { return nil, err } kibanaPayload, err := NewKibana(NewStateless{ ElasticsearchRefID: params.ElasticsearchInstance.RefID, API: params.API, RefID: params.KibanaInstance.RefID, Version: version, Region: params.Region, TemplateID: params.DeploymentTemplateID, Size: params.KibanaInstance.Size, ZoneCount: params.KibanaInstance.ZoneCount, DeploymentTemplateInfoV2: res, }) if err != nil { return nil, err } resources := models.DeploymentCreateResources{ Elasticsearch: []*models.ElasticsearchPayload{esPayload}, Kibana: []*models.KibanaPayload{kibanaPayload}, } if params.ApmEnable { apmPayload, err := NewApm(NewStateless{ ElasticsearchRefID: params.ElasticsearchInstance.RefID, API: params.API, RefID: params.ApmInstance.RefID, Version: version, Region: params.Region, TemplateID: params.DeploymentTemplateID, Size: params.ApmInstance.Size, ZoneCount: params.ApmInstance.ZoneCount, DeploymentTemplateInfoV2: res, }) if err != nil { return nil, err } resources.Apm = []*models.ApmPayload{apmPayload} } if params.AppsearchEnable { appsearchPayload, err := NewAppSearch(NewStateless{ ElasticsearchRefID: params.ElasticsearchInstance.RefID, API: params.API, RefID: params.AppsearchInstance.RefID, Version: version, Region: params.Region, TemplateID: params.DeploymentTemplateID, Size: params.AppsearchInstance.Size, ZoneCount: params.AppsearchInstance.ZoneCount, DeploymentTemplateInfoV2: res, }) if err != nil { return nil, err } resources.Appsearch = []*models.AppSearchPayload{appsearchPayload} } if params.EnterpriseSearchEnable { enterpriseSearchPayload, err := NewEnterpriseSearch( NewStateless{ ElasticsearchRefID: params.ElasticsearchInstance.RefID, API: params.API, RefID: params.EnterpriseSearchInstance.RefID, Version: version, Region: params.Region, TemplateID: params.DeploymentTemplateID, Size: params.EnterpriseSearchInstance.Size, ZoneCount: params.EnterpriseSearchInstance.ZoneCount, DeploymentTemplateInfoV2: res, }) if err != nil { return nil, err } resources.EnterpriseSearch = []*models.EnterpriseSearchPayload{enterpriseSearchPayload} } payload := models.DeploymentCreateRequest{ Name: params.Name, Resources: &resources, } return &payload, nil }