diff --git a/CHANGELOG.md b/CHANGELOG.md index ce7f0df54..4917ee20a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Add support for Terraform Plugin Framework ([#343](https://github.com/elastic/terraform-provider-elasticstack/pull/343)). - Fix fleet resources not having ID set on import ([#447](https://github.com/elastic/terraform-provider-elasticstack/pull/447)) - Fix Fleet Agent Policy monitoring settings ([#448](https://github.com/elastic/terraform-provider-elasticstack/pull/448)) +- Add `elasticstack_fleet_package` and `elasticstack_fleet_package_policy` resources ([#454](https://github.com/elastic/terraform-provider-elasticstack/pull/454)) ## [0.9.0] - 2023-10-09 diff --git a/docs/resources/fleet_agent_policy.md b/docs/resources/fleet_agent_policy.md index df090d0a6..431593ceb 100644 --- a/docs/resources/fleet_agent_policy.md +++ b/docs/resources/fleet_agent_policy.md @@ -57,5 +57,5 @@ resource "elasticstack_fleet_agent_policy" "test_policy" { Import is supported using the following syntax: ```shell -terraform import elasticstack_kibana_fleet_agent_policy.my_policy +terraform import elasticstack_fleet_agent_policy.my_policy ``` diff --git a/docs/resources/fleet_package.md b/docs/resources/fleet_package.md new file mode 100644 index 000000000..2166579e5 --- /dev/null +++ b/docs/resources/fleet_package.md @@ -0,0 +1,47 @@ +--- +subcategory: "Fleet" +layout: "" +page_title: "Elasticstack: elasticstack_fleet_package Resource" +description: |- + Installs or uninstalls a Fleet integration package. +--- + +# Resource: elasticstack_fleet_package + +Installs or uninstalls a Fleet integration package. The Kibana Fleet UI can be +used to view available packages. Additional information for managing integration +packages can be found [here](https://www.elastic.co/guide/en/fleet/current/install-uninstall-integration-assets.html). + +To prevent the package from being uninstalled when the resource is destroyed, +set `skip_destroy` to `true`. + +## Example Usage + +```terraform +provider "elasticstack" { + kibana {} +} + +resource "elasticstack_fleet_package" "test_package" { + name = "tcp" + version = "1.16.0" + force = true +} +``` + + +## Schema + +### Required + +- `name` (String) The package name. +- `version` (String) The package version. + +### Optional + +- `force` (Boolean) Set to true to force the requested action. +- `skip_destroy` (Boolean) Set to true if you do not wish the package to be uninstalled at destroy time, and instead just remove the package from the Terraform state. + +### Read-Only + +- `id` (String) The ID of this resource. diff --git a/docs/resources/fleet_package_policy.md b/docs/resources/fleet_package_policy.md new file mode 100644 index 000000000..eb5168aa8 --- /dev/null +++ b/docs/resources/fleet_package_policy.md @@ -0,0 +1,123 @@ +--- +subcategory: "Fleet" +layout: "" +page_title: "Elasticstack: elasticstack_fleet_package_policy Resource" +description: |- + Creates or updates a Fleet Package Policy. +--- + +# Resource: elasticstack_fleet_package_policy + +Creates or updates a Fleet Package Policy. + +It is highly recommended that all inputs and streams are provided in the +Terraform plan, even if some are disabled. Otherwise, differences may appear +between what is in the plan versus what is returned by the Fleet API. + +The [Kibana Fleet UI](https://www.elastic.co/guide/en/fleet/current/add-integration-to-policy.html) +can be used as a reference for what data needs to be provided. Instead of saving +a new integration configuration, the API request can be previewed, showing what +values need to be provided for inputs and their streams. + +## Example Usage + +```terraform +provider "elasticstack" { + fleet {} +} + +// The package to use. +resource "elasticstack_fleet_package" "sample" { + name = "tcp" + version = "1.16.0" + force = true +} + +// An agent policy to hold the package policy. +resource "elasticstack_fleet_agent_policy" "sample" { + name = "Sample Agent Policy" + namespace = "default" + description = "A sample agent policy" + monitor_logs = true + monitor_metrics = true + skip_destroy = false +} + +// The associated enrollment token. +data "elasticstack_fleet_enrollment_tokens" "sample" { + policy_id = elasticstack_fleet_agent_policy.sample.policy_id +} + +// The package policy. +resource "elasticstack_fleet_package_policy" "sample" { + name = "Sample Package Policy" + namespace = "default" + description = "A sample package policy" + agent_policy_id = elasticstack_fleet_agent_policy.sample.policy_id + package_name = elasticstack_fleet_package.sample.name + package_version = elasticstack_fleet_package.sample.version + + input { + input_id = "tcp-tcp" + streams_json = jsonencode({ + "tcp.generic" : { + "enabled" : true, + "vars" : { + "listen_address" : "localhost", + "listen_port" : 8080, + "data_stream.dataset" : "tcp.generic", + "tags" : [], + "syslog_options" : "field: message\n#format: auto\n#timezone: Local\n", + "ssl" : "#certificate: |\n# -----BEGIN CERTIFICATE-----\n# ...\n# -----END CERTIFICATE-----\n#key: |\n# -----BEGIN PRIVATE KEY-----\n# ...\n# -----END PRIVATE KEY-----\n", + "custom" : "" + } + } + }) + } +} +``` + + +## Schema + +### Required + +- `agent_policy_id` (String) ID of the agent policy. +- `input` (Block List, Min: 1) (see [below for nested schema](#nestedblock--input)) +- `name` (String) The name of the package policy. +- `namespace` (String) The namespace of the package policy. +- `package_name` (String) The name of the package. +- `package_version` (String) The version of the package. + +### Optional + +- `description` (String) The description of the package policy. +- `enabled` (Boolean) Enable the package policy. +- `force` (Boolean) Force operations, such as creation and deletion, to occur. +- `policy_id` (String) Unique identifier of the package policy. +- `vars_json` (String, Sensitive) Package-level variables as JSON. + +### Read-Only + +- `id` (String) The ID of this resource. + + +### Nested Schema for `input` + +Required: + +- `input_id` (String) The identifier of the input. + +Optional: + +- `enabled` (Boolean) Enable the input. +- `streams_json` (String, Sensitive) Input streams as JSON. +- `vars_json` (String, Sensitive) Input variables as JSON. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import elasticstack_fleet_package_policy.my_policy +``` diff --git a/examples/resources/elasticstack_fleet_agent_policy/import.sh b/examples/resources/elasticstack_fleet_agent_policy/import.sh index 3235f94e1..c3ce60089 100644 --- a/examples/resources/elasticstack_fleet_agent_policy/import.sh +++ b/examples/resources/elasticstack_fleet_agent_policy/import.sh @@ -1 +1 @@ -terraform import elasticstack_kibana_fleet_agent_policy.my_policy +terraform import elasticstack_fleet_agent_policy.my_policy diff --git a/examples/resources/elasticstack_fleet_package/resource.tf b/examples/resources/elasticstack_fleet_package/resource.tf new file mode 100644 index 000000000..c9d4bf07d --- /dev/null +++ b/examples/resources/elasticstack_fleet_package/resource.tf @@ -0,0 +1,9 @@ +provider "elasticstack" { + kibana {} +} + +resource "elasticstack_fleet_package" "test_package" { + name = "tcp" + version = "1.16.0" + force = true +} diff --git a/examples/resources/elasticstack_fleet_package_policy/import.sh b/examples/resources/elasticstack_fleet_package_policy/import.sh new file mode 100644 index 000000000..85885893b --- /dev/null +++ b/examples/resources/elasticstack_fleet_package_policy/import.sh @@ -0,0 +1 @@ +terraform import elasticstack_fleet_package_policy.my_policy diff --git a/examples/resources/elasticstack_fleet_package_policy/resource.tf b/examples/resources/elasticstack_fleet_package_policy/resource.tf new file mode 100644 index 000000000..616aca71e --- /dev/null +++ b/examples/resources/elasticstack_fleet_package_policy/resource.tf @@ -0,0 +1,53 @@ +provider "elasticstack" { + fleet {} +} + +// The package to use. +resource "elasticstack_fleet_package" "sample" { + name = "tcp" + version = "1.16.0" + force = true +} + +// An agent policy to hold the package policy. +resource "elasticstack_fleet_agent_policy" "sample" { + name = "Sample Agent Policy" + namespace = "default" + description = "A sample agent policy" + monitor_logs = true + monitor_metrics = true + skip_destroy = false +} + +// The associated enrollment token. +data "elasticstack_fleet_enrollment_tokens" "sample" { + policy_id = elasticstack_fleet_agent_policy.sample.policy_id +} + +// The package policy. +resource "elasticstack_fleet_package_policy" "sample" { + name = "Sample Package Policy" + namespace = "default" + description = "A sample package policy" + agent_policy_id = elasticstack_fleet_agent_policy.sample.policy_id + package_name = elasticstack_fleet_package.sample.name + package_version = elasticstack_fleet_package.sample.version + + input { + input_id = "tcp-tcp" + streams_json = jsonencode({ + "tcp.generic" : { + "enabled" : true, + "vars" : { + "listen_address" : "localhost", + "listen_port" : 8080, + "data_stream.dataset" : "tcp.generic", + "tags" : [], + "syslog_options" : "field: message\n#format: auto\n#timezone: Local\n", + "ssl" : "#certificate: |\n# -----BEGIN CERTIFICATE-----\n# ...\n# -----END CERTIFICATE-----\n#key: |\n# -----BEGIN PRIVATE KEY-----\n# ...\n# -----END PRIVATE KEY-----\n", + "custom" : "" + } + } + }) + } +} diff --git a/generated/fleet/fleet.gen.go b/generated/fleet/fleet.gen.go index 281424c55..54b9c3ad3 100644 --- a/generated/fleet/fleet.gen.go +++ b/generated/fleet/fleet.gen.go @@ -1,6 +1,6 @@ // Package fleet provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/deepmap/oapi-codegen version v1.14.0 DO NOT EDIT. +// Code generated by github.com/deepmap/oapi-codegen version v1.15.0 DO NOT EDIT. package fleet import ( @@ -40,6 +40,29 @@ const ( Metrics AgentPolicyUpdateRequestMonitoringEnabled = "metrics" ) +// Defines values for ElasticsearchAssetType. +const ( + ComponentTemplate ElasticsearchAssetType = "component_template" + DataStreamIlmPolicy ElasticsearchAssetType = "data_stream_ilm_policy" + IlmPolicy ElasticsearchAssetType = "ilm_policy" + IndexTemplate ElasticsearchAssetType = "index_template" + IngestPipeline ElasticsearchAssetType = "ingest_pipeline" + Transform ElasticsearchAssetType = "transform" +) + +// Defines values for KibanaSavedObjectType. +const ( + CspRuleTemplate KibanaSavedObjectType = "csp_rule_template" + Dashboard KibanaSavedObjectType = "dashboard" + IndexPattern KibanaSavedObjectType = "index-pattern" + Lens KibanaSavedObjectType = "lens" + Map KibanaSavedObjectType = "map" + MlModule KibanaSavedObjectType = "ml-module" + Search KibanaSavedObjectType = "search" + SecurityRule KibanaSavedObjectType = "security-rule" + Visualization KibanaSavedObjectType = "visualization" +) + // Defines values for OutputCreateRequestElasticsearchType. const ( OutputCreateRequestElasticsearchTypeElasticsearch OutputCreateRequestElasticsearchType = "elasticsearch" @@ -98,6 +121,66 @@ const ( OutputUpdateRequestLogstashTypeLogstash OutputUpdateRequestLogstashType = "logstash" ) +// Defines values for PackageInfoConditionsElasticsearchSubscription. +const ( + Basic PackageInfoConditionsElasticsearchSubscription = "basic" + Enterprise PackageInfoConditionsElasticsearchSubscription = "enterprise" + Gold PackageInfoConditionsElasticsearchSubscription = "gold" + Platinum PackageInfoConditionsElasticsearchSubscription = "platinum" +) + +// Defines values for PackageInfoRelease. +const ( + Beta PackageInfoRelease = "beta" + Experimental PackageInfoRelease = "experimental" + Ga PackageInfoRelease = "ga" +) + +// Defines values for PackageInfoSourceLicense. +const ( + Apache20 PackageInfoSourceLicense = "Apache-2.0" + Elastic20 PackageInfoSourceLicense = "Elastic-2.0" +) + +// Defines values for PackageInstallSource. +const ( + Bundled PackageInstallSource = "bundled" + Registry PackageInstallSource = "registry" + Upload PackageInstallSource = "upload" +) + +// Defines values for PackageStatus. +const ( + InstallFailed PackageStatus = "install_failed" + Installed PackageStatus = "installed" + Installing PackageStatus = "installing" + NotInstalled PackageStatus = "not_installed" +) + +// Defines values for Format. +const ( + FormatLegacy Format = "legacy" + FormatSimplified Format = "simplified" +) + +// Defines values for CreatePackagePolicyParamsFormat. +const ( + CreatePackagePolicyParamsFormatLegacy CreatePackagePolicyParamsFormat = "legacy" + CreatePackagePolicyParamsFormatSimplified CreatePackagePolicyParamsFormat = "simplified" +) + +// Defines values for GetPackagePolicyParamsFormat. +const ( + GetPackagePolicyParamsFormatLegacy GetPackagePolicyParamsFormat = "legacy" + GetPackagePolicyParamsFormatSimplified GetPackagePolicyParamsFormat = "simplified" +) + +// Defines values for UpdatePackagePolicyParamsFormat. +const ( + UpdatePackagePolicyParamsFormatLegacy UpdatePackagePolicyParamsFormat = "legacy" + UpdatePackagePolicyParamsFormatSimplified UpdatePackagePolicyParamsFormat = "simplified" +) + // AgentPolicy defines model for agent_policy. type AgentPolicy struct { AgentFeatures *[]struct { @@ -120,14 +203,11 @@ type AgentPolicy struct { Namespace string `json:"namespace"` // Overrides Override settings that are defined in the agent policy. Input settings cannot be overridden. The override option should be used only in unusual circumstances and not as a routine procedure. - Overrides *map[string]interface{} `json:"overrides"` - - // PackagePolicies This field is present only when retrieving a single agent policy, or when retrieving a list of agent policies with the ?full=true parameter - PackagePolicies *[]PackagePolicy `json:"package_policies,omitempty"` - Revision *float32 `json:"revision,omitempty"` - UnenrollTimeout *float32 `json:"unenroll_timeout,omitempty"` - UpdatedBy *string `json:"updated_by,omitempty"` - UpdatedOn *time.Time `json:"updated_on,omitempty"` + Overrides *map[string]interface{} `json:"overrides"` + Revision *float32 `json:"revision,omitempty"` + UnenrollTimeout *float32 `json:"unenroll_timeout,omitempty"` + UpdatedBy *string `json:"updated_by,omitempty"` + UpdatedOn *time.Time `json:"updated_on,omitempty"` } // AgentPolicyMonitoringEnabled defines model for AgentPolicy.MonitoringEnabled. @@ -178,6 +258,9 @@ type AgentPolicyUpdateRequest struct { // AgentPolicyUpdateRequestMonitoringEnabled defines model for AgentPolicyUpdateRequest.MonitoringEnabled. type AgentPolicyUpdateRequestMonitoringEnabled string +// ElasticsearchAssetType defines model for elasticsearch_asset_type. +type ElasticsearchAssetType string + // EnrollmentApiKey defines model for enrollment_api_key. type EnrollmentApiKey struct { Active bool `json:"active"` @@ -198,28 +281,21 @@ type FleetServerHost struct { Name *string `json:"name,omitempty"` } +// KibanaSavedObjectType defines model for kibana_saved_object_type. +type KibanaSavedObjectType string + // NewPackagePolicy defines model for new_package_policy. type NewPackagePolicy struct { - Description *string `json:"description,omitempty"` - Enabled *bool `json:"enabled,omitempty"` - Inputs []struct { - Config *map[string]interface{} `json:"config,omitempty"` - Enabled bool `json:"enabled"` - Processors *[]string `json:"processors,omitempty"` - Streams *[]interface{} `json:"streams,omitempty"` - Type string `json:"type"` - Vars *map[string]interface{} `json:"vars,omitempty"` - } `json:"inputs"` - Name string `json:"name"` - Namespace *string `json:"namespace,omitempty"` + Description *string `json:"description,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + Inputs map[string]PackagePolicyInput `json:"inputs"` + Name string `json:"name"` + Namespace *string `json:"namespace,omitempty"` // Deprecated: - OutputId *string `json:"output_id,omitempty"` - Package *struct { - Name string `json:"name"` - Title *string `json:"title,omitempty"` - Version string `json:"version"` - } `json:"package,omitempty"` - PolicyId *string `json:"policy_id,omitempty"` + OutputId *string `json:"output_id,omitempty"` + Package *PackagePolicyPackageInfo `json:"package,omitempty"` + PolicyId *string `json:"policy_id,omitempty"` + Vars *map[string]interface{} `json:"vars,omitempty"` } // OutputCreateRequest defines model for output_create_request. @@ -504,32 +580,173 @@ type OutputUpdateRequestLogstash struct { // OutputUpdateRequestLogstashType defines model for OutputUpdateRequestLogstash.Type. type OutputUpdateRequestLogstashType string +// PackageInfo defines model for package_info. +type PackageInfo struct { + Assets []string `json:"assets"` + Categories []string `json:"categories"` + Conditions struct { + Elasticsearch *struct { + Subscription *PackageInfoConditionsElasticsearchSubscription `json:"subscription,omitempty"` + } `json:"elasticsearch,omitempty"` + Kibana *struct { + Versions *string `json:"versions,omitempty"` + } `json:"kibana,omitempty"` + } `json:"conditions"` + DataStreams *[]struct { + IngesetPipeline string `json:"ingeset_pipeline"` + Name string `json:"name"` + Package string `json:"package"` + Release string `json:"release"` + Title string `json:"title"` + Type string `json:"type"` + Vars *[]struct { + Default string `json:"default"` + Name string `json:"name"` + } `json:"vars,omitempty"` + } `json:"data_streams,omitempty"` + Description string `json:"description"` + Download string `json:"download"` + Elasticsearch *struct { + Privileges *struct { + Cluster *[]string `json:"cluster,omitempty"` + } `json:"privileges,omitempty"` + } `json:"elasticsearch,omitempty"` + FormatVersion string `json:"format_version"` + Icons *[]string `json:"icons,omitempty"` + Internal *bool `json:"internal,omitempty"` + Name string `json:"name"` + Path string `json:"path"` + Readme *string `json:"readme,omitempty"` + + // Release release label is deprecated, derive from the version instead (packages follow semver) + // Deprecated: + Release *PackageInfoRelease `json:"release,omitempty"` + Screenshots *[]struct { + Path string `json:"path"` + Size *string `json:"size,omitempty"` + Src string `json:"src"` + Title *string `json:"title,omitempty"` + Type *string `json:"type,omitempty"` + } `json:"screenshots,omitempty"` + Source *struct { + License *PackageInfoSourceLicense `json:"license,omitempty"` + } `json:"source,omitempty"` + Title string `json:"title"` + Type string `json:"type"` + Version string `json:"version"` +} + +// PackageInfoConditionsElasticsearchSubscription defines model for PackageInfo.Conditions.Elasticsearch.Subscription. +type PackageInfoConditionsElasticsearchSubscription string + +// PackageInfoRelease release label is deprecated, derive from the version instead (packages follow semver) +type PackageInfoRelease string + +// PackageInfoSourceLicense defines model for PackageInfo.Source.License. +type PackageInfoSourceLicense string + +// PackageInstallSource defines model for package_install_source. +type PackageInstallSource string + +// PackageItemType defines model for package_item_type. +type PackageItemType struct { + union json.RawMessage +} + // PackagePolicy defines model for package_policy. type PackagePolicy struct { + Description *string `json:"description,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + Id string `json:"id"` + Inputs map[string]PackagePolicyInput `json:"inputs"` + Name string `json:"name"` + Namespace *string `json:"namespace,omitempty"` + // Deprecated: + OutputId *string `json:"output_id,omitempty"` + Package *PackagePolicyPackageInfo `json:"package,omitempty"` + PolicyId *string `json:"policy_id,omitempty"` + Revision float32 `json:"revision"` + Vars *map[string]interface{} `json:"vars,omitempty"` +} + +// PackagePolicyInput defines model for package_policy_input. +type PackagePolicyInput struct { + Config *map[string]interface{} `json:"config,omitempty"` + Enabled bool `json:"enabled"` + Processors *[]string `json:"processors,omitempty"` + Streams *map[string]interface{} `json:"streams,omitempty"` + Type string `json:"type"` + Vars *map[string]interface{} `json:"vars,omitempty"` +} + +// PackagePolicyPackageInfo defines model for package_policy_package_info. +type PackagePolicyPackageInfo struct { + Name string `json:"name"` + Title *string `json:"title,omitempty"` + Version string `json:"version"` +} + +// PackagePolicyRequest defines model for package_policy_request. +type PackagePolicyRequest struct { + // Description Package policy description Description *string `json:"description,omitempty"` - Enabled *bool `json:"enabled,omitempty"` - Id string `json:"id"` - Inputs []struct { - Config *map[string]interface{} `json:"config,omitempty"` - Enabled bool `json:"enabled"` - Processors *[]string `json:"processors,omitempty"` - Streams *[]interface{} `json:"streams,omitempty"` - Type string `json:"type"` - Vars *map[string]interface{} `json:"vars,omitempty"` - } `json:"inputs"` - Name string `json:"name"` + + // Force Force package policy creation even if package is not verified, or if the agent policy is managed. + Force *bool `json:"force,omitempty"` + + // Id Package policy unique identifier + Id *string `json:"id,omitempty"` + + // Inputs Package policy inputs (see integration documentation to know what inputs are available) + Inputs *map[string]PackagePolicyRequestInput `json:"inputs,omitempty"` + + // Name Package policy name (should be unique) + Name string `json:"name"` + + // Namespace namespace by default "default" Namespace *string `json:"namespace,omitempty"` - // Deprecated: - OutputId *string `json:"output_id,omitempty"` - Package *struct { - Name string `json:"name"` - Title *string `json:"title,omitempty"` - Version string `json:"version"` - } `json:"package,omitempty"` - PolicyId *string `json:"policy_id,omitempty"` - Revision float32 `json:"revision"` + Package struct { + // Name Package name + Name string `json:"name"` + + // Version Package version + Version string `json:"version"` + } `json:"package"` + + // PolicyId Agent policy ID where that package policy will be added + PolicyId string `json:"policy_id"` + + // Vars Package root level variable (see integration documentation for more information) + Vars *map[string]interface{} `json:"vars,omitempty"` +} + +// PackagePolicyRequestInput defines model for package_policy_request_input. +type PackagePolicyRequestInput struct { + // Enabled enable or disable that input, (default to true) + Enabled *bool `json:"enabled,omitempty"` + + // Streams Input streams (see integration documentation to know what streams are available) + Streams *map[string]PackagePolicyRequestInputStream `json:"streams,omitempty"` + + // Vars Input level variable (see integration documentation for more information) + Vars *map[string]interface{} `json:"vars,omitempty"` +} + +// PackagePolicyRequestInputStream defines model for package_policy_request_input_stream. +type PackagePolicyRequestInputStream struct { + // Enabled enable or disable that stream, (default to true) + Enabled *bool `json:"enabled,omitempty"` + + // Vars Stream level variable (see integration documentation for more information) + Vars *map[string]interface{} `json:"vars,omitempty"` } +// PackageStatus defines model for package_status. +type PackageStatus string + +// Format defines model for format. +type Format string + // Error defines model for error. type Error struct { Error *string `json:"error,omitempty"` @@ -542,6 +759,70 @@ type DeleteAgentPolicyJSONBody struct { AgentPolicyId string `json:"agentPolicyId"` } +// DeletePackageJSONBody defines parameters for DeletePackage. +type DeletePackageJSONBody struct { + Force *bool `json:"force,omitempty"` +} + +// DeletePackageParams defines parameters for DeletePackage. +type DeletePackageParams struct { + // IgnoreUnverified Ignore if the package is fails signature verification + IgnoreUnverified *bool `form:"ignoreUnverified,omitempty" json:"ignoreUnverified,omitempty"` + + // Full Return all fields from the package manifest, not just those supported by the Elastic Package Registry + Full *bool `form:"full,omitempty" json:"full,omitempty"` + + // Prerelease Whether to return prerelease versions of packages (e.g. beta, rc, preview) + Prerelease *bool `form:"prerelease,omitempty" json:"prerelease,omitempty"` +} + +// GetPackageParams defines parameters for GetPackage. +type GetPackageParams struct { + // IgnoreUnverified Ignore if the package is fails signature verification + IgnoreUnverified *bool `form:"ignoreUnverified,omitempty" json:"ignoreUnverified,omitempty"` + + // Full Return all fields from the package manifest, not just those supported by the Elastic Package Registry + Full *bool `form:"full,omitempty" json:"full,omitempty"` + + // Prerelease Whether to return prerelease versions of packages (e.g. beta, rc, preview) + Prerelease *bool `form:"prerelease,omitempty" json:"prerelease,omitempty"` +} + +// InstallPackageJSONBody defines parameters for InstallPackage. +type InstallPackageJSONBody struct { + Force *bool `json:"force,omitempty"` + IgnoreConstraints *bool `json:"ignore_constraints,omitempty"` +} + +// InstallPackageParams defines parameters for InstallPackage. +type InstallPackageParams struct { + // IgnoreUnverified Ignore if the package is fails signature verification + IgnoreUnverified *bool `form:"ignoreUnverified,omitempty" json:"ignoreUnverified,omitempty"` + + // Full Return all fields from the package manifest, not just those supported by the Elastic Package Registry + Full *bool `form:"full,omitempty" json:"full,omitempty"` + + // Prerelease Whether to return prerelease versions of packages (e.g. beta, rc, preview) + Prerelease *bool `form:"prerelease,omitempty" json:"prerelease,omitempty"` +} + +// UpdatePackageJSONBody defines parameters for UpdatePackage. +type UpdatePackageJSONBody struct { + KeepPoliciesUpToDate *bool `json:"keepPoliciesUpToDate,omitempty"` +} + +// UpdatePackageParams defines parameters for UpdatePackage. +type UpdatePackageParams struct { + // IgnoreUnverified Ignore if the package is fails signature verification + IgnoreUnverified *bool `form:"ignoreUnverified,omitempty" json:"ignoreUnverified,omitempty"` + + // Full Return all fields from the package manifest, not just those supported by the Elastic Package Registry + Full *bool `form:"full,omitempty" json:"full,omitempty"` + + // Prerelease Whether to return prerelease versions of packages (e.g. beta, rc, preview) + Prerelease *bool `form:"prerelease,omitempty" json:"prerelease,omitempty"` +} + // PostFleetServerHostsJSONBody defines parameters for PostFleetServerHosts. type PostFleetServerHostsJSONBody struct { HostUrls []string `json:"host_urls"` @@ -557,6 +838,38 @@ type UpdateFleetServerHostsJSONBody struct { Name *string `json:"name,omitempty"` } +// CreatePackagePolicyParams defines parameters for CreatePackagePolicy. +type CreatePackagePolicyParams struct { + // Format Simplified or legacy format for package inputs + Format *CreatePackagePolicyParamsFormat `form:"format,omitempty" json:"format,omitempty"` +} + +// CreatePackagePolicyParamsFormat defines parameters for CreatePackagePolicy. +type CreatePackagePolicyParamsFormat string + +// DeletePackagePolicyParams defines parameters for DeletePackagePolicy. +type DeletePackagePolicyParams struct { + Force *bool `form:"force,omitempty" json:"force,omitempty"` +} + +// GetPackagePolicyParams defines parameters for GetPackagePolicy. +type GetPackagePolicyParams struct { + // Format Simplified or legacy format for package inputs + Format *GetPackagePolicyParamsFormat `form:"format,omitempty" json:"format,omitempty"` +} + +// GetPackagePolicyParamsFormat defines parameters for GetPackagePolicy. +type GetPackagePolicyParamsFormat string + +// UpdatePackagePolicyParams defines parameters for UpdatePackagePolicy. +type UpdatePackagePolicyParams struct { + // Format Simplified or legacy format for package inputs + Format *UpdatePackagePolicyParamsFormat `form:"format,omitempty" json:"format,omitempty"` +} + +// UpdatePackagePolicyParamsFormat defines parameters for UpdatePackagePolicy. +type UpdatePackagePolicyParamsFormat string + // CreateAgentPolicyJSONRequestBody defines body for CreateAgentPolicy for application/json ContentType. type CreateAgentPolicyJSONRequestBody = AgentPolicyCreateRequest @@ -566,6 +879,15 @@ type DeleteAgentPolicyJSONRequestBody DeleteAgentPolicyJSONBody // UpdateAgentPolicyJSONRequestBody defines body for UpdateAgentPolicy for application/json ContentType. type UpdateAgentPolicyJSONRequestBody = AgentPolicyUpdateRequest +// DeletePackageJSONRequestBody defines body for DeletePackage for application/json ContentType. +type DeletePackageJSONRequestBody DeletePackageJSONBody + +// InstallPackageJSONRequestBody defines body for InstallPackage for application/json ContentType. +type InstallPackageJSONRequestBody InstallPackageJSONBody + +// UpdatePackageJSONRequestBody defines body for UpdatePackage for application/json ContentType. +type UpdatePackageJSONRequestBody UpdatePackageJSONBody + // PostFleetServerHostsJSONRequestBody defines body for PostFleetServerHosts for application/json ContentType. type PostFleetServerHostsJSONRequestBody PostFleetServerHostsJSONBody @@ -578,6 +900,12 @@ type PostOutputsJSONRequestBody = OutputCreateRequest // UpdateOutputJSONRequestBody defines body for UpdateOutput for application/json ContentType. type UpdateOutputJSONRequestBody = OutputUpdateRequest +// CreatePackagePolicyJSONRequestBody defines body for CreatePackagePolicy for application/json ContentType. +type CreatePackagePolicyJSONRequestBody = PackagePolicyRequest + +// UpdatePackagePolicyJSONRequestBody defines body for UpdatePackagePolicy for application/json ContentType. +type UpdatePackagePolicyJSONRequestBody = PackagePolicyRequest + // AsOutputCreateRequestElasticsearch returns the union data inside the OutputCreateRequest as a OutputCreateRequestElasticsearch func (t OutputCreateRequest) AsOutputCreateRequestElasticsearch() (OutputCreateRequestElasticsearch, error) { var body OutputCreateRequestElasticsearch @@ -816,6 +1144,68 @@ func (t *OutputUpdateRequest) UnmarshalJSON(b []byte) error { return err } +// AsKibanaSavedObjectType returns the union data inside the PackageItemType as a KibanaSavedObjectType +func (t PackageItemType) AsKibanaSavedObjectType() (KibanaSavedObjectType, error) { + var body KibanaSavedObjectType + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromKibanaSavedObjectType overwrites any union data inside the PackageItemType as the provided KibanaSavedObjectType +func (t *PackageItemType) FromKibanaSavedObjectType(v KibanaSavedObjectType) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeKibanaSavedObjectType performs a merge with any union data inside the PackageItemType, using the provided KibanaSavedObjectType +func (t *PackageItemType) MergeKibanaSavedObjectType(v KibanaSavedObjectType) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JsonMerge(t.union, b) + t.union = merged + return err +} + +// AsElasticsearchAssetType returns the union data inside the PackageItemType as a ElasticsearchAssetType +func (t PackageItemType) AsElasticsearchAssetType() (ElasticsearchAssetType, error) { + var body ElasticsearchAssetType + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromElasticsearchAssetType overwrites any union data inside the PackageItemType as the provided ElasticsearchAssetType +func (t *PackageItemType) FromElasticsearchAssetType(v ElasticsearchAssetType) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeElasticsearchAssetType performs a merge with any union data inside the PackageItemType, using the provided ElasticsearchAssetType +func (t *PackageItemType) MergeElasticsearchAssetType(v ElasticsearchAssetType) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JsonMerge(t.union, b) + t.union = merged + return err +} + +func (t PackageItemType) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *PackageItemType) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -910,6 +1300,24 @@ type ClientInterface interface { // GetEnrollmentApiKeys request GetEnrollmentApiKeys(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeletePackageWithBody request with any body + DeletePackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DeletePackage(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, body DeletePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetPackage request + GetPackage(ctx context.Context, pkgName string, pkgVersion string, params *GetPackageParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // InstallPackageWithBody request with any body + InstallPackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + InstallPackage(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, body InstallPackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // UpdatePackageWithBody request with any body + UpdatePackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdatePackage(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, body UpdatePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // PostFleetServerHostsWithBody request with any body PostFleetServerHostsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -941,6 +1349,22 @@ type ClientInterface interface { UpdateOutputWithBody(ctx context.Context, outputId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) UpdateOutput(ctx context.Context, outputId string, body UpdateOutputJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CreatePackagePolicyWithBody request with any body + CreatePackagePolicyWithBody(ctx context.Context, params *CreatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CreatePackagePolicy(ctx context.Context, params *CreatePackagePolicyParams, body CreatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DeletePackagePolicy request + DeletePackagePolicy(ctx context.Context, packagePolicyId string, params *DeletePackagePolicyParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetPackagePolicy request + GetPackagePolicy(ctx context.Context, packagePolicyId string, params *GetPackagePolicyParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // UpdatePackagePolicyWithBody request with any body + UpdatePackagePolicyWithBody(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdatePackagePolicy(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, body UpdatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) CreateAgentPolicyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -1039,6 +1463,90 @@ func (c *Client) GetEnrollmentApiKeys(ctx context.Context, reqEditors ...Request return c.Client.Do(req) } +func (c *Client) DeletePackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeletePackageRequestWithBody(c.Server, pkgName, pkgVersion, params, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DeletePackage(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, body DeletePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeletePackageRequest(c.Server, pkgName, pkgVersion, params, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) GetPackage(ctx context.Context, pkgName string, pkgVersion string, params *GetPackageParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetPackageRequest(c.Server, pkgName, pkgVersion, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) InstallPackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInstallPackageRequestWithBody(c.Server, pkgName, pkgVersion, params, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) InstallPackage(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, body InstallPackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInstallPackageRequest(c.Server, pkgName, pkgVersion, params, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) UpdatePackageWithBody(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdatePackageRequestWithBody(c.Server, pkgName, pkgVersion, params, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) UpdatePackage(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, body UpdatePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdatePackageRequest(c.Server, pkgName, pkgVersion, params, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) PostFleetServerHostsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewPostFleetServerHostsRequestWithBody(c.Server, contentType, body) if err != nil { @@ -1183,22 +1691,94 @@ func (c *Client) UpdateOutput(ctx context.Context, outputId string, body UpdateO return c.Client.Do(req) } -// NewCreateAgentPolicyRequest calls the generic CreateAgentPolicy builder with application/json body -func NewCreateAgentPolicyRequest(server string, body CreateAgentPolicyJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +func (c *Client) CreatePackagePolicyWithBody(ctx context.Context, params *CreatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreatePackagePolicyRequestWithBody(c.Server, params, contentType, body) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewCreateAgentPolicyRequestWithBody(server, "application/json", bodyReader) + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) } -// NewCreateAgentPolicyRequestWithBody generates requests for CreateAgentPolicy with any type of body -func NewCreateAgentPolicyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) +func (c *Client) CreatePackagePolicy(ctx context.Context, params *CreatePackagePolicyParams, body CreatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreatePackagePolicyRequest(c.Server, params, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DeletePackagePolicy(ctx context.Context, packagePolicyId string, params *DeletePackagePolicyParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeletePackagePolicyRequest(c.Server, packagePolicyId, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) GetPackagePolicy(ctx context.Context, packagePolicyId string, params *GetPackagePolicyParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetPackagePolicyRequest(c.Server, packagePolicyId, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) UpdatePackagePolicyWithBody(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdatePackagePolicyRequestWithBody(c.Server, packagePolicyId, params, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) UpdatePackagePolicy(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, body UpdatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdatePackagePolicyRequest(c.Server, packagePolicyId, params, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewCreateAgentPolicyRequest calls the generic CreateAgentPolicy builder with application/json body +func NewCreateAgentPolicyRequest(server string, body CreateAgentPolicyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCreateAgentPolicyRequestWithBody(server, "application/json", bodyReader) +} + +// NewCreateAgentPolicyRequestWithBody generates requests for CreateAgentPolicy with any type of body +func NewCreateAgentPolicyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) if err != nil { return nil, err } @@ -1371,6 +1951,425 @@ func NewGetEnrollmentApiKeysRequest(server string) (*http.Request, error) { return req, nil } +// NewDeletePackageRequest calls the generic DeletePackage builder with application/json body +func NewDeletePackageRequest(server string, pkgName string, pkgVersion string, params *DeletePackageParams, body DeletePackageJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDeletePackageRequestWithBody(server, pkgName, pkgVersion, params, "application/json", bodyReader) +} + +// NewDeletePackageRequestWithBody generates requests for DeletePackage with any type of body +func NewDeletePackageRequestWithBody(server string, pkgName string, pkgVersion string, params *DeletePackageParams, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "pkgName", runtime.ParamLocationPath, pkgName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pkgVersion", runtime.ParamLocationPath, pkgVersion) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/epm/packages/%s/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.IgnoreUnverified != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "ignoreUnverified", runtime.ParamLocationQuery, *params.IgnoreUnverified); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Full != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "full", runtime.ParamLocationQuery, *params.Full); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Prerelease != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "prerelease", runtime.ParamLocationQuery, *params.Prerelease); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("DELETE", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewGetPackageRequest generates requests for GetPackage +func NewGetPackageRequest(server string, pkgName string, pkgVersion string, params *GetPackageParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "pkgName", runtime.ParamLocationPath, pkgName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pkgVersion", runtime.ParamLocationPath, pkgVersion) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/epm/packages/%s/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.IgnoreUnverified != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "ignoreUnverified", runtime.ParamLocationQuery, *params.IgnoreUnverified); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Full != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "full", runtime.ParamLocationQuery, *params.Full); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Prerelease != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "prerelease", runtime.ParamLocationQuery, *params.Prerelease); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewInstallPackageRequest calls the generic InstallPackage builder with application/json body +func NewInstallPackageRequest(server string, pkgName string, pkgVersion string, params *InstallPackageParams, body InstallPackageJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewInstallPackageRequestWithBody(server, pkgName, pkgVersion, params, "application/json", bodyReader) +} + +// NewInstallPackageRequestWithBody generates requests for InstallPackage with any type of body +func NewInstallPackageRequestWithBody(server string, pkgName string, pkgVersion string, params *InstallPackageParams, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "pkgName", runtime.ParamLocationPath, pkgName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pkgVersion", runtime.ParamLocationPath, pkgVersion) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/epm/packages/%s/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.IgnoreUnverified != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "ignoreUnverified", runtime.ParamLocationQuery, *params.IgnoreUnverified); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Full != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "full", runtime.ParamLocationQuery, *params.Full); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Prerelease != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "prerelease", runtime.ParamLocationQuery, *params.Prerelease); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewUpdatePackageRequest calls the generic UpdatePackage builder with application/json body +func NewUpdatePackageRequest(server string, pkgName string, pkgVersion string, params *UpdatePackageParams, body UpdatePackageJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdatePackageRequestWithBody(server, pkgName, pkgVersion, params, "application/json", bodyReader) +} + +// NewUpdatePackageRequestWithBody generates requests for UpdatePackage with any type of body +func NewUpdatePackageRequestWithBody(server string, pkgName string, pkgVersion string, params *UpdatePackageParams, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "pkgName", runtime.ParamLocationPath, pkgName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pkgVersion", runtime.ParamLocationPath, pkgVersion) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/epm/packages/%s/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.IgnoreUnverified != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "ignoreUnverified", runtime.ParamLocationQuery, *params.IgnoreUnverified); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Full != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "full", runtime.ParamLocationQuery, *params.Full); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Prerelease != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "prerelease", runtime.ParamLocationQuery, *params.Prerelease); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewPostFleetServerHostsRequest calls the generic PostFleetServerHosts builder with application/json body func NewPostFleetServerHostsRequest(server string, body PostFleetServerHostsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -1681,6 +2680,249 @@ func NewUpdateOutputRequestWithBody(server string, outputId string, contentType return req, nil } +// NewCreatePackagePolicyRequest calls the generic CreatePackagePolicy builder with application/json body +func NewCreatePackagePolicyRequest(server string, params *CreatePackagePolicyParams, body CreatePackagePolicyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCreatePackagePolicyRequestWithBody(server, params, "application/json", bodyReader) +} + +// NewCreatePackagePolicyRequestWithBody generates requests for CreatePackagePolicy with any type of body +func NewCreatePackagePolicyRequestWithBody(server string, params *CreatePackagePolicyParams, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/package_policies") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Format != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "format", runtime.ParamLocationQuery, *params.Format); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDeletePackagePolicyRequest generates requests for DeletePackagePolicy +func NewDeletePackagePolicyRequest(server string, packagePolicyId string, params *DeletePackagePolicyParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "packagePolicyId", runtime.ParamLocationPath, packagePolicyId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/package_policies/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Force != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewGetPackagePolicyRequest generates requests for GetPackagePolicy +func NewGetPackagePolicyRequest(server string, packagePolicyId string, params *GetPackagePolicyParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "packagePolicyId", runtime.ParamLocationPath, packagePolicyId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/package_policies/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Format != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "format", runtime.ParamLocationQuery, *params.Format); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewUpdatePackagePolicyRequest calls the generic UpdatePackagePolicy builder with application/json body +func NewUpdatePackagePolicyRequest(server string, packagePolicyId string, params *UpdatePackagePolicyParams, body UpdatePackagePolicyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdatePackagePolicyRequestWithBody(server, packagePolicyId, params, "application/json", bodyReader) +} + +// NewUpdatePackagePolicyRequestWithBody generates requests for UpdatePackagePolicy with any type of body +func NewUpdatePackagePolicyRequestWithBody(server string, packagePolicyId string, params *UpdatePackagePolicyParams, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "packagePolicyId", runtime.ParamLocationPath, packagePolicyId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/package_policies/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Format != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "format", runtime.ParamLocationQuery, *params.Format); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { for _, r := range c.RequestEditors { if err := r(ctx, req); err != nil { @@ -1745,6 +2987,24 @@ type ClientWithResponsesInterface interface { // GetEnrollmentApiKeysWithResponse request GetEnrollmentApiKeysWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetEnrollmentApiKeysResponse, error) + // DeletePackageWithBodyWithResponse request with any body + DeletePackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeletePackageResponse, error) + + DeletePackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, body DeletePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*DeletePackageResponse, error) + + // GetPackageWithResponse request + GetPackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *GetPackageParams, reqEditors ...RequestEditorFn) (*GetPackageResponse, error) + + // InstallPackageWithBodyWithResponse request with any body + InstallPackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InstallPackageResponse, error) + + InstallPackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, body InstallPackageJSONRequestBody, reqEditors ...RequestEditorFn) (*InstallPackageResponse, error) + + // UpdatePackageWithBodyWithResponse request with any body + UpdatePackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdatePackageResponse, error) + + UpdatePackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, body UpdatePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdatePackageResponse, error) + // PostFleetServerHostsWithBodyWithResponse request with any body PostFleetServerHostsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostFleetServerHostsResponse, error) @@ -1776,6 +3036,22 @@ type ClientWithResponsesInterface interface { UpdateOutputWithBodyWithResponse(ctx context.Context, outputId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateOutputResponse, error) UpdateOutputWithResponse(ctx context.Context, outputId string, body UpdateOutputJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateOutputResponse, error) + + // CreatePackagePolicyWithBodyWithResponse request with any body + CreatePackagePolicyWithBodyWithResponse(ctx context.Context, params *CreatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreatePackagePolicyResponse, error) + + CreatePackagePolicyWithResponse(ctx context.Context, params *CreatePackagePolicyParams, body CreatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*CreatePackagePolicyResponse, error) + + // DeletePackagePolicyWithResponse request + DeletePackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *DeletePackagePolicyParams, reqEditors ...RequestEditorFn) (*DeletePackagePolicyResponse, error) + + // GetPackagePolicyWithResponse request + GetPackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *GetPackagePolicyParams, reqEditors ...RequestEditorFn) (*GetPackagePolicyResponse, error) + + // UpdatePackagePolicyWithBodyWithResponse request with any body + UpdatePackagePolicyWithBodyWithResponse(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdatePackagePolicyResponse, error) + + UpdatePackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, body UpdatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdatePackagePolicyResponse, error) } type CreateAgentPolicyResponse struct { @@ -1909,6 +3185,125 @@ func (r GetEnrollmentApiKeysResponse) StatusCode() int { return 0 } +type DeletePackageResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r DeletePackageResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DeletePackageResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type GetPackageResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Item *PackageInfo `json:"item,omitempty"` + KeepPoliciesUpToDate *bool `json:"keepPoliciesUpToDate,omitempty"` + LatestVersion *string `json:"latestVersion,omitempty"` + LicensePath *string `json:"licensePath,omitempty"` + Notice *string `json:"notice,omitempty"` + // Deprecated: + SavedObject map[string]interface{} `json:"savedObject"` + Status PackageStatus `json:"status"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r GetPackageResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetPackageResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type InstallPackageResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Meta *struct { + InstallSource *PackageInstallSource `json:"install_source,omitempty"` + } `json:"_meta,omitempty"` + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r InstallPackageResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r InstallPackageResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type UpdatePackageResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r UpdatePackageResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r UpdatePackageResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type PostFleetServerHostsResponse struct { Body []byte HTTPResponse *http.Response @@ -2109,6 +3504,108 @@ func (r UpdateOutputResponse) StatusCode() int { return 0 } +type CreatePackagePolicyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Item PackagePolicy `json:"item"` + } + JSON400 *Error + JSON409 *Error +} + +// Status returns HTTPResponse.Status +func (r CreatePackagePolicyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CreatePackagePolicyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DeletePackagePolicyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Id string `json:"id"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r DeletePackagePolicyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DeletePackagePolicyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type GetPackagePolicyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Item PackagePolicy `json:"item"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r GetPackagePolicyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetPackagePolicyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type UpdatePackagePolicyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + Item PackagePolicy `json:"item"` + Sucess bool `json:"sucess"` + } + JSON400 *Error +} + +// Status returns HTTPResponse.Status +func (r UpdatePackagePolicyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r UpdatePackagePolicyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + // CreateAgentPolicyWithBodyWithResponse request with arbitrary body returning *CreateAgentPolicyResponse func (c *ClientWithResponses) CreateAgentPolicyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateAgentPolicyResponse, error) { rsp, err := c.CreateAgentPolicyWithBody(ctx, contentType, body, reqEditors...) @@ -2178,6 +3675,66 @@ func (c *ClientWithResponses) GetEnrollmentApiKeysWithResponse(ctx context.Conte return ParseGetEnrollmentApiKeysResponse(rsp) } +// DeletePackageWithBodyWithResponse request with arbitrary body returning *DeletePackageResponse +func (c *ClientWithResponses) DeletePackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeletePackageResponse, error) { + rsp, err := c.DeletePackageWithBody(ctx, pkgName, pkgVersion, params, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDeletePackageResponse(rsp) +} + +func (c *ClientWithResponses) DeletePackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *DeletePackageParams, body DeletePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*DeletePackageResponse, error) { + rsp, err := c.DeletePackage(ctx, pkgName, pkgVersion, params, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDeletePackageResponse(rsp) +} + +// GetPackageWithResponse request returning *GetPackageResponse +func (c *ClientWithResponses) GetPackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *GetPackageParams, reqEditors ...RequestEditorFn) (*GetPackageResponse, error) { + rsp, err := c.GetPackage(ctx, pkgName, pkgVersion, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetPackageResponse(rsp) +} + +// InstallPackageWithBodyWithResponse request with arbitrary body returning *InstallPackageResponse +func (c *ClientWithResponses) InstallPackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InstallPackageResponse, error) { + rsp, err := c.InstallPackageWithBody(ctx, pkgName, pkgVersion, params, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseInstallPackageResponse(rsp) +} + +func (c *ClientWithResponses) InstallPackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *InstallPackageParams, body InstallPackageJSONRequestBody, reqEditors ...RequestEditorFn) (*InstallPackageResponse, error) { + rsp, err := c.InstallPackage(ctx, pkgName, pkgVersion, params, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseInstallPackageResponse(rsp) +} + +// UpdatePackageWithBodyWithResponse request with arbitrary body returning *UpdatePackageResponse +func (c *ClientWithResponses) UpdatePackageWithBodyWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdatePackageResponse, error) { + rsp, err := c.UpdatePackageWithBody(ctx, pkgName, pkgVersion, params, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdatePackageResponse(rsp) +} + +func (c *ClientWithResponses) UpdatePackageWithResponse(ctx context.Context, pkgName string, pkgVersion string, params *UpdatePackageParams, body UpdatePackageJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdatePackageResponse, error) { + rsp, err := c.UpdatePackage(ctx, pkgName, pkgVersion, params, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdatePackageResponse(rsp) +} + // PostFleetServerHostsWithBodyWithResponse request with arbitrary body returning *PostFleetServerHostsResponse func (c *ClientWithResponses) PostFleetServerHostsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostFleetServerHostsResponse, error) { rsp, err := c.PostFleetServerHostsWithBody(ctx, contentType, body, reqEditors...) @@ -2279,7 +3836,59 @@ func (c *ClientWithResponses) UpdateOutputWithResponse(ctx context.Context, outp if err != nil { return nil, err } - return ParseUpdateOutputResponse(rsp) + return ParseUpdateOutputResponse(rsp) +} + +// CreatePackagePolicyWithBodyWithResponse request with arbitrary body returning *CreatePackagePolicyResponse +func (c *ClientWithResponses) CreatePackagePolicyWithBodyWithResponse(ctx context.Context, params *CreatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreatePackagePolicyResponse, error) { + rsp, err := c.CreatePackagePolicyWithBody(ctx, params, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreatePackagePolicyResponse(rsp) +} + +func (c *ClientWithResponses) CreatePackagePolicyWithResponse(ctx context.Context, params *CreatePackagePolicyParams, body CreatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*CreatePackagePolicyResponse, error) { + rsp, err := c.CreatePackagePolicy(ctx, params, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreatePackagePolicyResponse(rsp) +} + +// DeletePackagePolicyWithResponse request returning *DeletePackagePolicyResponse +func (c *ClientWithResponses) DeletePackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *DeletePackagePolicyParams, reqEditors ...RequestEditorFn) (*DeletePackagePolicyResponse, error) { + rsp, err := c.DeletePackagePolicy(ctx, packagePolicyId, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseDeletePackagePolicyResponse(rsp) +} + +// GetPackagePolicyWithResponse request returning *GetPackagePolicyResponse +func (c *ClientWithResponses) GetPackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *GetPackagePolicyParams, reqEditors ...RequestEditorFn) (*GetPackagePolicyResponse, error) { + rsp, err := c.GetPackagePolicy(ctx, packagePolicyId, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetPackagePolicyResponse(rsp) +} + +// UpdatePackagePolicyWithBodyWithResponse request with arbitrary body returning *UpdatePackagePolicyResponse +func (c *ClientWithResponses) UpdatePackagePolicyWithBodyWithResponse(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdatePackagePolicyResponse, error) { + rsp, err := c.UpdatePackagePolicyWithBody(ctx, packagePolicyId, params, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdatePackagePolicyResponse(rsp) +} + +func (c *ClientWithResponses) UpdatePackagePolicyWithResponse(ctx context.Context, packagePolicyId string, params *UpdatePackagePolicyParams, body UpdatePackagePolicyJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdatePackagePolicyResponse, error) { + rsp, err := c.UpdatePackagePolicy(ctx, packagePolicyId, params, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdatePackagePolicyResponse(rsp) } // ParseCreateAgentPolicyResponse parses an HTTP response from a CreateAgentPolicyWithResponse call @@ -2463,6 +4072,165 @@ func ParseGetEnrollmentApiKeysResponse(rsp *http.Response) (*GetEnrollmentApiKey return response, nil } +// ParseDeletePackageResponse parses an HTTP response from a DeletePackageWithResponse call +func ParseDeletePackageResponse(rsp *http.Response) (*DeletePackageResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DeletePackageResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + +// ParseGetPackageResponse parses an HTTP response from a GetPackageWithResponse call +func ParseGetPackageResponse(rsp *http.Response) (*GetPackageResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetPackageResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Item *PackageInfo `json:"item,omitempty"` + KeepPoliciesUpToDate *bool `json:"keepPoliciesUpToDate,omitempty"` + LatestVersion *string `json:"latestVersion,omitempty"` + LicensePath *string `json:"licensePath,omitempty"` + Notice *string `json:"notice,omitempty"` + // Deprecated: + SavedObject map[string]interface{} `json:"savedObject"` + Status PackageStatus `json:"status"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + +// ParseInstallPackageResponse parses an HTTP response from a InstallPackageWithResponse call +func ParseInstallPackageResponse(rsp *http.Response) (*InstallPackageResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &InstallPackageResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Meta *struct { + InstallSource *PackageInstallSource `json:"install_source,omitempty"` + } `json:"_meta,omitempty"` + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + +// ParseUpdatePackageResponse parses an HTTP response from a UpdatePackageWithResponse call +func ParseUpdatePackageResponse(rsp *http.Response) (*UpdatePackageResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &UpdatePackageResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Items []struct { + Id string `json:"id"` + Type PackageItemType `json:"type"` + } `json:"items"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + // ParsePostFleetServerHostsResponse parses an HTTP response from a PostFleetServerHostsWithResponse call func ParsePostFleetServerHostsResponse(rsp *http.Response) (*PostFleetServerHostsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -2742,3 +4510,151 @@ func ParseUpdateOutputResponse(rsp *http.Response) (*UpdateOutputResponse, error return response, nil } + +// ParseCreatePackagePolicyResponse parses an HTTP response from a CreatePackagePolicyWithResponse call +func ParseCreatePackagePolicyResponse(rsp *http.Response) (*CreatePackagePolicyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CreatePackagePolicyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Item PackagePolicy `json:"item"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 409: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON409 = &dest + + } + + return response, nil +} + +// ParseDeletePackagePolicyResponse parses an HTTP response from a DeletePackagePolicyWithResponse call +func ParseDeletePackagePolicyResponse(rsp *http.Response) (*DeletePackagePolicyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DeletePackagePolicyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Id string `json:"id"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + +// ParseGetPackagePolicyResponse parses an HTTP response from a GetPackagePolicyWithResponse call +func ParseGetPackagePolicyResponse(rsp *http.Response) (*GetPackagePolicyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetPackagePolicyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Item PackagePolicy `json:"item"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} + +// ParseUpdatePackagePolicyResponse parses an HTTP response from a UpdatePackagePolicyWithResponse call +func ParseUpdatePackagePolicyResponse(rsp *http.Response) (*UpdatePackagePolicyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &UpdatePackagePolicyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + Item PackagePolicy `json:"item"` + Sucess bool `json:"sucess"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + } + + return response, nil +} diff --git a/generated/fleet/getschema.go b/generated/fleet/getschema.go index 99c54875c..65f331084 100644 --- a/generated/fleet/getschema.go +++ b/generated/fleet/getschema.go @@ -68,20 +68,26 @@ var transformers = []TransformFunc{ transformFilterPaths, transformOutputTypeRequired, transformOutputResponseType, + transformSchemasInputsType, + transformInlinePackageDefinitions, + transformAddPackagePolicyVars, } // transformFilterPaths filters the paths in a schema down to // a specified list of endpoints and methods. func transformFilterPaths(schema *Schema) { var includePaths = map[string][]string{ - "/agent_policies": {"post"}, - "/agent_policies/{agentPolicyId}": {"get", "put"}, - "/agent_policies/delete": {"post"}, - "/enrollment_api_keys": {"get"}, - "/fleet_server_hosts": {"post"}, - "/fleet_server_hosts/{itemId}": {"get", "put", "delete"}, - "/outputs": {"post"}, - "/outputs/{outputId}": {"get", "put", "delete"}, + "/agent_policies": {"post"}, + "/agent_policies/{agentPolicyId}": {"get", "put"}, + "/agent_policies/delete": {"post"}, + "/enrollment_api_keys": {"get"}, + "/fleet_server_hosts": {"post"}, + "/fleet_server_hosts/{itemId}": {"get", "put", "delete"}, + "/outputs": {"post"}, + "/outputs/{outputId}": {"get", "put", "delete"}, + "/package_policies": {"post"}, + "/package_policies/{packagePolicyId}": {"get", "put", "delete"}, + "/epm/packages/{pkgName}/{pkgVersion}": {"get", "put", "post", "delete"}, } // filterKbnXsrfParameter filters out an entry if it is a kbn_xsrf parameter. @@ -190,6 +196,141 @@ func transformOutputResponseType(schema *Schema) { } } +// transformSchemasInputsType transforms the "inputs" property on the +// "new_package_policy" component schema from an array to an object, +// so it aligns with expected data type from the Fleet API. +func transformSchemasInputsType(schema *Schema) { + inputs, ok := schema.Components.GetFields("schemas.new_package_policy.properties.inputs") + if !ok { + return + } + + inputs.Set("items.properties.streams.type", "object") + + inputs.Set("type", "object") + inputs.Move("items", "additionalProperties") + + // Drop package_policies from Agent Policy, these will be managed separately + // through the Package Policy resource. + agentPolicy, _ := schema.Components.GetFields("schemas.agent_policy") + agentPolicy.Delete("properties.package_policies") +} + +// transformInlinePackageDefinitions relocates inline type definitions for the +// EPM endpoints to the dedicated schemas section of the OpenAPI schema. This needs +// to be done as there is a bug in the OpenAPI generator which causes types to +// be generated with invalid names: +// https://github.com/deepmap/oapi-codegen/issues/1121 +func transformInlinePackageDefinitions(schema *Schema) { + epmPath, ok := schema.Paths["/epm/packages/{pkgName}/{pkgVersion}"] + if !ok { + panic("epm path not found") + } + + // Get + { + props, ok := epmPath.Get.Responses.GetFields("200.content.application/json.schema.allOf.1.properties") + if !ok { + panic("properties not found") + } + + // status needs to be moved to schemes and a ref inserted in its place. + value, _ := props.Get("status") + schema.Components.Set("schemas.package_status", value) + props.Delete("status") + props.Set("status.$ref", "#/components/schemas/package_status") + } + + // Post + { + props, ok := epmPath.Post.Responses.GetFields("200.content.application/json.schema.properties") + if !ok { + panic("properties not found") + } + + // _meta.properties.install_source + value, _ := props.GetFields("_meta.properties.install_source") + schema.Components.Set("schemas.package_install_source", value) + props.Delete("_meta.properties.install_source") + props.Set("_meta.properties.install_source.$ref", "#/components/schemas/package_install_source") + + // items.items.properties.type + value, _ = props.GetFields("items.items.properties.type") + schema.Components.Set("schemas.package_item_type", value) + props.Delete("items.items.properties.type") + props.Set("items.items.properties.type.$ref", "#/components/schemas/package_item_type") + } + + // Put + { + props, ok := epmPath.Put.Responses.GetFields("200.content.application/json.schema.properties") + if !ok { + panic("properties not found") + } + + // items.items.properties.type (definition already moved by Post) + props.Delete("items.items.properties.type") + props.Set("items.items.properties.type.$ref", "#/components/schemas/package_item_type") + } + + // Delete + { + props, ok := epmPath.Delete.Responses.GetFields("200.content.application/json.schema.properties") + if !ok { + panic("properties not found") + } + + // items.items.properties.type (definition already moved by Post) + props.Delete("items.items.properties.type") + props.Set("items.items.properties.type.$ref", "#/components/schemas/package_item_type") + } + + // Move embedded objects (structs) to schemas so Go-types are generated. + { + // package_policy_request_input_stream + field, _ := schema.Components.GetFields("schemas.package_policy_request.properties.inputs.additionalProperties.properties.streams") + props, _ := field.Get("additionalProperties") + schema.Components.Set("schemas.package_policy_request_input_stream", props) + field.Delete("additionalProperties") + field.Set("additionalProperties.$ref", "#/components/schemas/package_policy_request_input_stream") + + // package_policy_request_input + field, _ = schema.Components.GetFields("schemas.package_policy_request.properties.inputs") + props, _ = field.Get("additionalProperties") + schema.Components.Set("schemas.package_policy_request_input", props) + field.Delete("additionalProperties") + field.Set("additionalProperties.$ref", "#/components/schemas/package_policy_request_input") + + // package_policy_package_info + field, _ = schema.Components.GetFields("schemas.new_package_policy.properties") + props, _ = field.Get("package") + schema.Components.Set("schemas.package_policy_package_info", props) + field.Delete("package") + field.Set("package.$ref", "#/components/schemas/package_policy_package_info") + + // package_policy_input + field, _ = schema.Components.GetFields("schemas.new_package_policy.properties.inputs") + props, _ = field.Get("additionalProperties") + schema.Components.Set("schemas.package_policy_input", props) + field.Delete("additionalProperties") + field.Set("additionalProperties.$ref", "#/components/schemas/package_policy_input") + } +} + +// transformAddPackagePolicyVars adds the missing 'vars' field to the +// PackagePolicy schema struct. +func transformAddPackagePolicyVars(schema *Schema) { + inputs, ok := schema.Components.GetFields("schemas.new_package_policy.properties") + if !ok { + panic("properties not found") + } + + // Only add it if it doesn't exist. + if _, ok = inputs.Get("vars"); !ok { + inputs.Set("vars.type", "object") + } +} + // downloadFile will download a file from url and return the // bytes. If the request fails, or a non 200 error code is // observed in the response, an error is returned instead. diff --git a/internal/clients/fleet/fleet.go b/internal/clients/fleet/fleet.go index e017622c2..781dcc584 100644 --- a/internal/clients/fleet/fleet.go +++ b/internal/clients/fleet/fleet.go @@ -2,13 +2,19 @@ package fleet import ( "context" + "errors" "fmt" + "io" "net/http" fleetapi "github.com/elastic/terraform-provider-elasticstack/generated/fleet" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" ) +var ( + ErrPackageNotFound = errors.New("package not found") +) + // AllEnrollmentTokens reads all enrollment tokens from the API. func AllEnrollmentTokens(ctx context.Context, client *Client) ([]fleetapi.EnrollmentApiKey, diag.Diagnostics) { resp, err := client.API.GetEnrollmentApiKeysWithResponse(ctx) @@ -218,6 +224,160 @@ func DeleteFleetServerHost(ctx context.Context, client *Client, id string) diag. } } +// ReadPackagePolicy reads a specific package policy from the API. +func ReadPackagePolicy(ctx context.Context, client *Client, id string) (*fleetapi.PackagePolicy, diag.Diagnostics) { + format := fleetapi.GetPackagePolicyParamsFormatSimplified + params := fleetapi.GetPackagePolicyParams{ + Format: &format, + } + + resp, err := client.API.GetPackagePolicyWithResponse(ctx, id, ¶ms) + if err != nil { + return nil, diag.FromErr(err) + } + + switch resp.StatusCode() { + case http.StatusOK: + return &resp.JSON200.Item, nil + case http.StatusNotFound: + return nil, nil + default: + return nil, reportUnknownError(resp.StatusCode(), resp.Body) + } +} + +// CreatePackagePolicy creates a new package policy. +func CreatePackagePolicy(ctx context.Context, client *Client, req fleetapi.CreatePackagePolicyJSONRequestBody) (*fleetapi.PackagePolicy, diag.Diagnostics) { + format := fleetapi.CreatePackagePolicyParamsFormatSimplified + params := fleetapi.CreatePackagePolicyParams{ + Format: &format, + } + + resp, err := client.API.CreatePackagePolicyWithResponse(ctx, ¶ms, req) + if err != nil { + return nil, diag.FromErr(err) + } + + switch resp.StatusCode() { + case http.StatusOK: + return &resp.JSON200.Item, nil + default: + return nil, reportUnknownError(resp.StatusCode(), resp.Body) + } +} + +// UpdatePackagePolicy updates an existing package policy. +func UpdatePackagePolicy(ctx context.Context, client *Client, id string, req fleetapi.UpdatePackagePolicyJSONRequestBody) (*fleetapi.PackagePolicy, diag.Diagnostics) { + format := fleetapi.UpdatePackagePolicyParamsFormatSimplified + params := fleetapi.UpdatePackagePolicyParams{ + Format: &format, + } + + resp, err := client.API.UpdatePackagePolicyWithResponse(ctx, id, ¶ms, req) + if err != nil { + return nil, diag.FromErr(err) + } + + switch resp.StatusCode() { + case http.StatusOK: + return &resp.JSON200.Item, nil + default: + return nil, reportUnknownError(resp.StatusCode(), resp.Body) + } +} + +// DeletePackagePolicy deletes an existing package policy. +func DeletePackagePolicy(ctx context.Context, client *Client, id string, force bool) diag.Diagnostics { + params := fleetapi.DeletePackagePolicyParams{Force: &force} + resp, err := client.API.DeletePackagePolicyWithResponse(ctx, id, ¶ms) + if err != nil { + return diag.FromErr(err) + } + + switch resp.StatusCode() { + case http.StatusOK: + return nil + case http.StatusNotFound: + return nil + default: + return reportUnknownError(resp.StatusCode(), resp.Body) + } +} + +// ReadPackage reads a specific package from the API. +func ReadPackage(ctx context.Context, client *Client, name, version string) diag.Diagnostics { + params := fleetapi.GetPackageParams{} + + resp, err := client.API.GetPackage(ctx, name, version, ¶ms) + if err != nil { + return diag.FromErr(err) + } + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + return nil + case http.StatusNotFound: + return diag.FromErr(ErrPackageNotFound) + default: + errData, err := io.ReadAll(resp.Body) + if err != nil { + return diag.FromErr(err) + } + + return reportUnknownError(resp.StatusCode, errData) + } +} + +// InstallPackage installs a package. +func InstallPackage(ctx context.Context, client *Client, name, version string, force bool) diag.Diagnostics { + params := fleetapi.InstallPackageParams{} + body := fleetapi.InstallPackageJSONRequestBody{ + Force: &force, + IgnoreConstraints: nil, + } + + resp, err := client.API.InstallPackage(ctx, name, version, ¶ms, body) + if err != nil { + return diag.FromErr(err) + } + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + return nil + default: + errData, err := io.ReadAll(resp.Body) + if err != nil { + return diag.FromErr(err) + } + + return reportUnknownError(resp.StatusCode, errData) + } +} + +// Uninstall uninstalls a package. +func Uninstall(ctx context.Context, client *Client, name, version string, force bool) diag.Diagnostics { + params := fleetapi.DeletePackageParams{} + body := fleetapi.DeletePackageJSONRequestBody{ + Force: &force, + } + + resp, err := client.API.DeletePackageWithResponse(ctx, name, version, ¶ms, body) + if err != nil { + return diag.FromErr(err) + } + + switch resp.StatusCode() { + case http.StatusOK: + return nil + case http.StatusNotFound: + return nil + default: + return reportUnknownError(resp.StatusCode(), resp.Body) + } +} + func reportUnknownError(statusCode int, body []byte) diag.Diagnostics { return diag.Diagnostics{ diag.Diagnostic{ diff --git a/internal/fleet/package_policy_resource.go b/internal/fleet/package_policy_resource.go new file mode 100644 index 000000000..3206e02e3 --- /dev/null +++ b/internal/fleet/package_policy_resource.go @@ -0,0 +1,388 @@ +package fleet + +import ( + "context" + "encoding/json" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + + fleetapi "github.com/elastic/terraform-provider-elasticstack/generated/fleet" + "github.com/elastic/terraform-provider-elasticstack/internal/clients/fleet" +) + +func ResourcePackagePolicy() *schema.Resource { + packagePolicySchema := map[string]*schema.Schema{ + "policy_id": { + Description: "Unique identifier of the package policy.", + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + }, + "name": { + Description: "The name of the package policy.", + Type: schema.TypeString, + Required: true, + }, + "namespace": { + Description: "The namespace of the package policy.", + Type: schema.TypeString, + Required: true, + }, + "agent_policy_id": { + Description: "ID of the agent policy.", + Type: schema.TypeString, + Required: true, + }, + "description": { + Description: "The description of the package policy.", + Type: schema.TypeString, + Optional: true, + }, + "enabled": { + Description: "Enable the package policy.", + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + "force": { + Description: "Force operations, such as creation and deletion, to occur.", + Type: schema.TypeBool, + Optional: true, + }, + "package_name": { + Description: "The name of the package.", + Type: schema.TypeString, + Required: true, + }, + "package_version": { + Description: "The version of the package.", + Type: schema.TypeString, + Required: true, + }, + "input": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "input_id": { + Description: "The identifier of the input.", + Type: schema.TypeString, + Required: true, + }, + "enabled": { + Description: "Enable the input.", + Type: schema.TypeBool, + Default: true, + Optional: true, + }, + "streams_json": { + Description: "Input streams as JSON.", + Type: schema.TypeString, + ValidateFunc: validation.StringIsJSON, + Optional: true, + Computed: true, + Sensitive: true, + }, + "vars_json": { + Description: "Input variables as JSON.", + Type: schema.TypeString, + ValidateFunc: validation.StringIsJSON, + Computed: true, + Optional: true, + Sensitive: true, + }, + }, + }, + }, + "vars_json": { + Description: "Package-level variables as JSON.", + Type: schema.TypeString, + ValidateFunc: validation.StringIsJSON, + Computed: true, + Optional: true, + Sensitive: true, + }, + } + + return &schema.Resource{ + Description: "Creates a new Fleet Package Policy. See https://www.elastic.co/guide/en/fleet/current/agent-policy.html", + + CreateContext: resourcePackagePolicyCreate, + ReadContext: resourcePackagePolicyRead, + UpdateContext: resourcePackagePolicyUpdate, + DeleteContext: resourcePackagePolicyDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Schema: packagePolicySchema, + } +} + +func resourcePackagePolicyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + if id := d.Get("policy_id").(string); id != "" { + d.SetId(id) + } + + req := fleetapi.CreatePackagePolicyJSONRequestBody{ + PolicyId: d.Get("agent_policy_id").(string), + Name: d.Get("name").(string), + } + req.Package.Name = d.Get("package_name").(string) + req.Package.Version = d.Get("package_version").(string) + + if value := d.Get("policy_id").(string); value != "" { + req.Id = &value + } + if value := d.Get("namespace").(string); value != "" { + req.Namespace = &value + } + if value := d.Get("description").(string); value != "" { + req.Description = &value + } + if value := d.Get("force").(bool); value { + req.Force = &value + } + if varsRaw, _ := d.Get("vars_json").(string); varsRaw != "" { + vars := map[string]interface{}{} + if err := json.Unmarshal([]byte(varsRaw), &vars); err != nil { + panic(err) + } + req.Vars = &vars + } + + values := d.Get("input").([]interface{}) + if len(values) > 0 { + inputMap := map[string]fleetapi.PackagePolicyRequestInput{} + + for _, v := range values { + var input fleetapi.PackagePolicyRequestInput + + inputData := v.(map[string]interface{}) + inputID := inputData["input_id"].(string) + + enabled, _ := inputData["enabled"].(bool) + input.Enabled = &enabled + + if streamsRaw, _ := inputData["streams_json"].(string); streamsRaw != "" { + streams := map[string]fleetapi.PackagePolicyRequestInputStream{} + if err := json.Unmarshal([]byte(streamsRaw), &streams); err != nil { + panic(err) + } + input.Streams = &streams + } + if varsRaw, _ := inputData["vars_json"].(string); varsRaw != "" { + vars := map[string]interface{}{} + if err := json.Unmarshal([]byte(varsRaw), &vars); err != nil { + panic(err) + } + input.Vars = &vars + } + + inputMap[inputID] = input + } + + req.Inputs = &inputMap + } + + obj, diags := fleet.CreatePackagePolicy(ctx, fleetClient, req) + if diags.HasError() { + return diags + } + + d.SetId(obj.Id) + if err := d.Set("policy_id", obj.Id); err != nil { + return diag.FromErr(err) + } + + return resourcePackagePolicyRead(ctx, d, meta) +} + +func resourcePackagePolicyUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + req := fleetapi.UpdatePackagePolicyJSONRequestBody{ + PolicyId: d.Get("agent_policy_id").(string), + Name: d.Get("name").(string), + } + req.Package.Name = d.Get("package_name").(string) + req.Package.Version = d.Get("package_version").(string) + + if value := d.Get("policy_id").(string); value != "" { + req.Id = &value + } + if value := d.Get("namespace").(string); value != "" { + req.Namespace = &value + } + if value := d.Get("description").(string); value != "" { + req.Description = &value + } + if value := d.Get("force").(bool); value { + req.Force = &value + } + if varsRaw, _ := d.Get("vars_json").(string); varsRaw != "" { + vars := map[string]interface{}{} + if err := json.Unmarshal([]byte(varsRaw), &vars); err != nil { + panic(err) + } + req.Vars = &vars + } + + if values := d.Get("input").([]interface{}); len(values) > 0 { + inputMap := map[string]fleetapi.PackagePolicyRequestInput{} + + for _, v := range values { + var input fleetapi.PackagePolicyRequestInput + + inputData := v.(map[string]interface{}) + inputID := inputData["input_id"].(string) + + enabled, _ := inputData["enabled"].(bool) + input.Enabled = &enabled + + if streamsRaw, _ := inputData["streams_json"].(string); streamsRaw != "" { + streams := map[string]fleetapi.PackagePolicyRequestInputStream{} + if err := json.Unmarshal([]byte(streamsRaw), &streams); err != nil { + panic(err) + } + input.Streams = &streams + } + if varsRaw, _ := inputData["vars_json"].(string); varsRaw != "" { + vars := map[string]interface{}{} + if err := json.Unmarshal([]byte(varsRaw), &vars); err != nil { + panic(err) + } + input.Vars = &vars + } + + inputMap[inputID] = input + } + + req.Inputs = &inputMap + } + + _, diags = fleet.UpdatePackagePolicy(ctx, fleetClient, d.Id(), req) + if diags.HasError() { + return diags + } + + return resourcePackagePolicyRead(ctx, d, meta) +} + +func resourcePackagePolicyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + pkgPolicy, diags := fleet.ReadPackagePolicy(ctx, fleetClient, d.Id()) + if diags.HasError() { + return diags + } + + // Not found. + if pkgPolicy == nil { + d.SetId("") + return nil + } + + if err := d.Set("name", pkgPolicy.Name); err != nil { + return diag.FromErr(err) + } + if err := d.Set("namespace", pkgPolicy.Namespace); err != nil { + return diag.FromErr(err) + } + if err := d.Set("package_name", pkgPolicy.Package.Name); err != nil { + return diag.FromErr(err) + } + if err := d.Set("package_version", pkgPolicy.Package.Version); err != nil { + return diag.FromErr(err) + } + if err := d.Set("agent_policy_id", pkgPolicy.PolicyId); err != nil { + return diag.FromErr(err) + } + if pkgPolicy.Description != nil { + if err := d.Set("description", *pkgPolicy.Description); err != nil { + return diag.FromErr(err) + } + } + if pkgPolicy.Vars != nil { + + vars := make(map[string]any, len(*pkgPolicy.Vars)) + // Var values are wrapped in a type/value struct and need + // to be extracted. The only applies to reading values back + // from the API, sending var values does not use this format. + for k, v := range *pkgPolicy.Vars { + wrappedTypeValue, _ := v.(map[string]any) + if wrappedValue, ok := wrappedTypeValue["value"]; ok { + vars[k] = wrappedValue + } + } + + data, err := json.Marshal(vars) + if err != nil { + return diag.FromErr(err) + } + if err = d.Set("vars_json", string(data)); err != nil { + return diag.FromErr(err) + } + } + + var inputs []any + for inputID, input := range pkgPolicy.Inputs { + inputMap := map[string]any{ + "input_id": inputID, + "enabled": input.Enabled, + } + + if input.Streams != nil { + data, err := json.Marshal(*input.Streams) + if err != nil { + return diag.FromErr(err) + } + inputMap["streams_json"] = string(data) + } + if input.Vars != nil { + data, err := json.Marshal(*input.Vars) + if err != nil { + return diag.FromErr(err) + } + inputMap["vars_json"] = string(data) + } + + inputs = append(inputs, inputMap) + } + if err := d.Set("input", inputs); err != nil { + return diag.FromErr(err) + } + + return nil +} + +func resourcePackagePolicyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + force := d.Get("force").(bool) + + if diags = fleet.DeletePackagePolicy(ctx, fleetClient, d.Id(), force); diags.HasError() { + return diags + } + d.SetId("") + + return diags +} diff --git a/internal/fleet/package_policy_resource_test.go b/internal/fleet/package_policy_resource_test.go new file mode 100644 index 000000000..71f81e222 --- /dev/null +++ b/internal/fleet/package_policy_resource_test.go @@ -0,0 +1,204 @@ +package fleet_test + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/go-version" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + "github.com/elastic/terraform-provider-elasticstack/internal/acctest" + "github.com/elastic/terraform-provider-elasticstack/internal/clients" + "github.com/elastic/terraform-provider-elasticstack/internal/clients/fleet" + "github.com/elastic/terraform-provider-elasticstack/internal/versionutils" +) + +var minVersionPackagePolicy = version.Must(version.NewVersion("8.10.0")) + +func TestAccResourcePackagePolicy(t *testing.T) { + policyName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + CheckDestroy: checkResourcePackagePolicyDestroy, + ProtoV5ProviderFactories: acctest.Providers, + Steps: []resource.TestStep{ + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionPackagePolicy), + Config: testAccResourcePackagePolicyCreate(policyName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "name", policyName), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "description", "PackagePolicyTest Policy"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "package_name", "tcp"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "package_version", "1.16.0"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.input_id", "tcp-tcp"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.enabled", "true"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.streams_json", "{\"tcp.generic\":{\"enabled\":true,\"vars\":{\"custom\":\"\",\"data_stream.dataset\":\"tcp.generic\",\"listen_address\":\"localhost\",\"listen_port\":8080,\"ssl\":\"#certificate: |\\n# -----BEGIN CERTIFICATE-----\\n# ...\\n# -----END CERTIFICATE-----\\n#key: |\\n# -----BEGIN PRIVATE KEY-----\\n# ...\\n# -----END PRIVATE KEY-----\\n\",\"syslog_options\":\"field: message\\n#format: auto\\n#timezone: Local\\n\",\"tags\":[]}}}"), + ), + }, + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionPackagePolicy), + Config: testAccResourcePackagePolicyUpdate(policyName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "name", policyName), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "description", "Updated Package Policy"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "package_name", "tcp"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "package_version", "1.16.0"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.input_id", "tcp-tcp"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.enabled", "true"), + resource.TestCheckResourceAttr("elasticstack_fleet_package_policy.test_policy", "input.0.streams_json", "{\"tcp.generic\":{\"enabled\":true,\"vars\":{\"custom\":\"\",\"data_stream.dataset\":\"tcp.generic\",\"listen_address\":\"localhost\",\"listen_port\":8085,\"ssl\":\"#certificate: |\\n# -----BEGIN CERTIFICATE-----\\n# ...\\n# -----END CERTIFICATE-----\\n#key: |\\n# -----BEGIN PRIVATE KEY-----\\n# ...\\n# -----END PRIVATE KEY-----\\n\",\"syslog_options\":\"field: message\\n#format: auto\\n#timezone: Local\\n\",\"tags\":[]}}}"), + ), + }, + }, + }) +} + +func checkResourcePackagePolicyDestroy(s *terraform.State) error { + client, err := clients.NewAcceptanceTestingClient() + if err != nil { + return err + } + + fleetClient, err := client.GetFleetClient() + if err != nil { + return err + } + + for _, rs := range s.RootModule().Resources { + switch rs.Type { + case "elasticstack_fleet_package_policy": + packagePolicy, diag := fleet.ReadPackagePolicy(context.Background(), fleetClient, rs.Primary.ID) + if diag.HasError() { + return fmt.Errorf(diag[0].Summary) + } + if packagePolicy != nil { + return fmt.Errorf("package policy id=%v still exists, but it should have been removed", rs.Primary.ID) + } + case "elasticstack_fleet_agent_policy": + agentPolicy, diag := fleet.ReadAgentPolicy(context.Background(), fleetClient, rs.Primary.ID) + if diag.HasError() { + return fmt.Errorf(diag[0].Summary) + } + if agentPolicy != nil { + return fmt.Errorf("agent policy id=%v still exists, but it should have been removed", rs.Primary.ID) + } + default: + continue + } + + } + return nil +} + +func testAccResourcePackagePolicyCreate(id string) string { + return fmt.Sprintf(` +provider "elasticstack" { + elasticsearch {} + kibana {} +} + +resource "elasticstack_fleet_package" "test_policy" { + name = "tcp" + version = "1.16.0" + force = true +} + +resource "elasticstack_fleet_agent_policy" "test_policy" { + name = "%s Agent Policy" + namespace = "default" + description = "PackagePolicyTest Agent Policy" + monitor_logs = true + monitor_metrics = true + skip_destroy = false +} + +data "elasticstack_fleet_enrollment_tokens" "test_policy" { + policy_id = elasticstack_fleet_agent_policy.test_policy.policy_id +} + +resource "elasticstack_fleet_package_policy" "test_policy" { + name = "%s" + namespace = "default" + description = "PackagePolicyTest Policy" + agent_policy_id = elasticstack_fleet_agent_policy.test_policy.policy_id + package_name = elasticstack_fleet_package.test_policy.name + package_version = elasticstack_fleet_package.test_policy.version + + input { + input_id = "tcp-tcp" + streams_json = jsonencode({ + "tcp.generic": { + "enabled": true, + "vars": { + "listen_address": "localhost", + "listen_port": 8080, + "data_stream.dataset": "tcp.generic", + "tags": [], + "syslog_options": "field: message\n#format: auto\n#timezone: Local\n", + "ssl": "#certificate: |\n# -----BEGIN CERTIFICATE-----\n# ...\n# -----END CERTIFICATE-----\n#key: |\n# -----BEGIN PRIVATE KEY-----\n# ...\n# -----END PRIVATE KEY-----\n", + "custom": "" + } + } + }) + } +} +`, id, id) +} + +func testAccResourcePackagePolicyUpdate(id string) string { + return fmt.Sprintf(` +provider "elasticstack" { + elasticsearch {} + kibana {} +} + +resource "elasticstack_fleet_package" "test_policy" { + name = "tcp" + version = "1.16.0" + force = true +} + +resource "elasticstack_fleet_agent_policy" "test_policy" { + name = "%s Agent Policy" + namespace = "default" + description = "PackagePolicyTest Agent Policy" + monitor_logs = true + monitor_metrics = true + skip_destroy = false +} + +data "elasticstack_fleet_enrollment_tokens" "test_policy" { + policy_id = elasticstack_fleet_agent_policy.test_policy.policy_id +} + +resource "elasticstack_fleet_package_policy" "test_policy" { + name = "%s" + namespace = "default" + description = "Updated Package Policy" + agent_policy_id = elasticstack_fleet_agent_policy.test_policy.policy_id + package_name = elasticstack_fleet_package.test_policy.name + package_version = elasticstack_fleet_package.test_policy.version + + input { + input_id = "tcp-tcp" + streams_json = jsonencode({ + "tcp.generic": { + "enabled": true, + "vars": { + "listen_address": "localhost", + "listen_port": 8085, + "data_stream.dataset": "tcp.generic", + "tags": [], + "syslog_options": "field: message\n#format: auto\n#timezone: Local\n", + "ssl": "#certificate: |\n# -----BEGIN CERTIFICATE-----\n# ...\n# -----END CERTIFICATE-----\n#key: |\n# -----BEGIN PRIVATE KEY-----\n# ...\n# -----END PRIVATE KEY-----\n", + "custom": "" + } + } + }) + } +} +`, id, id) +} diff --git a/internal/fleet/package_resource.go b/internal/fleet/package_resource.go new file mode 100644 index 000000000..603b9538b --- /dev/null +++ b/internal/fleet/package_resource.go @@ -0,0 +1,122 @@ +package fleet + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/elastic/terraform-provider-elasticstack/internal/clients/fleet" + "github.com/elastic/terraform-provider-elasticstack/internal/utils" +) + +func getPackageID(name, version string) string { + hash, _ := utils.StringToHash(name + version) + + return *hash +} + +func ResourcePackage() *schema.Resource { + packageSchema := map[string]*schema.Schema{ + "name": { + Description: "The package name.", + Type: schema.TypeString, + ForceNew: true, + Required: true, + }, + "version": { + Description: "The package version.", + Type: schema.TypeString, + ForceNew: true, + Required: true, + }, + "force": { + Description: "Set to true to force the requested action.", + Type: schema.TypeBool, + Optional: true, + }, + "skip_destroy": { + Description: "Set to true if you do not wish the package to be uninstalled at destroy time, and instead just remove the package from the Terraform state.", + Type: schema.TypeBool, + Optional: true, + }, + } + + return &schema.Resource{ + Description: "Manage installation of a Fleet package.", + + CreateContext: resourcePackageInstall, + ReadContext: resourcePackageRead, + UpdateContext: resourcePackageInstall, + DeleteContext: resourcePackageDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Schema: packageSchema, + } +} + +func resourcePackageInstall(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + name := d.Get("name").(string) + version := d.Get("version").(string) + force := d.Get("force").(bool) + + d.SetId(getPackageID(name, version)) + + if diags = fleet.InstallPackage(ctx, fleetClient, name, version, force); diags.HasError() { + return diags + } + + return resourcePackageRead(ctx, d, meta) +} + +func resourcePackageRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + name := d.Get("name").(string) + version := d.Get("version").(string) + + d.SetId(getPackageID(name, version)) + + if diags = fleet.ReadPackage(ctx, fleetClient, name, version); diags.HasError() { + return diags + } + + return nil +} + +func resourcePackageDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + name := d.Get("name").(string) + version := d.Get("version").(string) + force := d.Get("force").(bool) + + if d.Get("skip_destroy").(bool) { + tflog.Debug(ctx, "Skipping uninstall of Package", map[string]interface{}{"name": name, "version": version}) + return nil + } + + d.SetId(getPackageID(name, version)) + + fleetClient, diags := getFleetClient(d, meta) + if diags.HasError() { + return diags + } + + if diags = fleet.Uninstall(ctx, fleetClient, name, version, force); diags.HasError() { + return diags + } + d.SetId("") + + return diags +} diff --git a/internal/fleet/package_resource_test.go b/internal/fleet/package_resource_test.go new file mode 100644 index 000000000..1563d855b --- /dev/null +++ b/internal/fleet/package_resource_test.go @@ -0,0 +1,44 @@ +package fleet_test + +import ( + "testing" + + "github.com/hashicorp/go-version" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + "github.com/elastic/terraform-provider-elasticstack/internal/acctest" + "github.com/elastic/terraform-provider-elasticstack/internal/versionutils" +) + +var minVersionPackage = version.Must(version.NewVersion("8.6.0")) + +const packageConfig = ` +provider "elasticstack" { + elasticsearch {} + kibana {} +} + +resource "elasticstack_fleet_package" "test_package" { + name = "tcp" + version = "1.16.0" + force = true + skip_destroy = true +} +` + +func TestAccResourcePackage(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ProtoV5ProviderFactories: acctest.Providers, + Steps: []resource.TestStep{ + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionPackage), + Config: packageConfig, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("elasticstack_fleet_package.test_package", "name", "tcp"), + resource.TestCheckResourceAttr("elasticstack_fleet_package.test_package", "version", "1.16.0"), + ), + }, + }, + }) +} diff --git a/provider/provider.go b/provider/provider.go index f62476e06..b4eea97ef 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -109,9 +109,11 @@ func New(version string) *schema.Provider { "elasticstack_kibana_security_role": kibana.ResourceRole(), "elasticstack_kibana_slo": kibana.ResourceSlo(), - "elasticstack_fleet_agent_policy": fleet.ResourceAgentPolicy(), - "elasticstack_fleet_output": fleet.ResourceOutput(), - "elasticstack_fleet_server_host": fleet.ResourceFleetServerHost(), + "elasticstack_fleet_agent_policy": fleet.ResourceAgentPolicy(), + "elasticstack_fleet_output": fleet.ResourceOutput(), + "elasticstack_fleet_server_host": fleet.ResourceFleetServerHost(), + "elasticstack_fleet_package": fleet.ResourcePackage(), + "elasticstack_fleet_package_policy": fleet.ResourcePackagePolicy(), }, } diff --git a/templates/resources/fleet_package.md.tmpl b/templates/resources/fleet_package.md.tmpl new file mode 100644 index 000000000..d5807f951 --- /dev/null +++ b/templates/resources/fleet_package.md.tmpl @@ -0,0 +1,22 @@ +--- +subcategory: "Fleet" +layout: "" +page_title: "Elasticstack: elasticstack_fleet_package Resource" +description: |- + Installs or uninstalls a Fleet integration package. +--- + +# Resource: elasticstack_fleet_package + +Installs or uninstalls a Fleet integration package. The Kibana Fleet UI can be +used to view available packages. Additional information for managing integration +packages can be found [here](https://www.elastic.co/guide/en/fleet/current/install-uninstall-integration-assets.html). + +To prevent the package from being uninstalled when the resource is destroyed, +set `skip_destroy` to `true`. + +## Example Usage + +{{ tffile "examples/resources/elasticstack_fleet_package/resource.tf" }} + +{{ .SchemaMarkdown | trimspace }} diff --git a/templates/resources/fleet_package_policy.md.tmpl b/templates/resources/fleet_package_policy.md.tmpl new file mode 100644 index 000000000..886b4a67e --- /dev/null +++ b/templates/resources/fleet_package_policy.md.tmpl @@ -0,0 +1,32 @@ +--- +subcategory: "Fleet" +layout: "" +page_title: "Elasticstack: elasticstack_fleet_package_policy Resource" +description: |- + Creates or updates a Fleet Package Policy. +--- + +# Resource: elasticstack_fleet_package_policy + +Creates or updates a Fleet Package Policy. + +It is highly recommended that all inputs and streams are provided in the +Terraform plan, even if some are disabled. Otherwise, differences may appear +between what is in the plan versus what is returned by the Fleet API. + +The [Kibana Fleet UI](https://www.elastic.co/guide/en/fleet/current/add-integration-to-policy.html) +can be used as a reference for what data needs to be provided. Instead of saving +a new integration configuration, the API request can be previewed, showing what +values need to be provided for inputs and their streams. + +## Example Usage + +{{ tffile "examples/resources/elasticstack_fleet_package_policy/resource.tf" }} + +{{ .SchemaMarkdown | trimspace }} + +## Import + +Import is supported using the following syntax: + +{{ codefile "shell" "examples/resources/elasticstack_fleet_package_policy/import.sh" }}