From 0f2866efb4db478ba00fa7de90fb8091cc34fa3b Mon Sep 17 00:00:00 2001 From: danischm Date: Tue, 5 Nov 2024 09:05:50 +0100 Subject: [PATCH] Add organization firmware upgrades data source --- CHANGELOG.md | 1 + .../organization_firmware_upgrades.md | 55 +++++ docs/guides/changelog.md | 1 + .../data-source.tf | 3 + .../organization_firmware_upgrades.yaml | 107 ++++++++++ ...e_meraki_organization_firmware_upgrades.go | 190 ++++++++++++++++++ ...aki_organization_firmware_upgrades_test.go | 71 +++++++ ...l_meraki_organization_firmware_upgrades.go | 175 ++++++++++++++++ internal/provider/provider.go | 1 + templates/guides/changelog.md.tmpl | 1 + 10 files changed, 605 insertions(+) create mode 100644 docs/data-sources/organization_firmware_upgrades.md create mode 100644 examples/data-sources/meraki_organization_firmware_upgrades/data-source.tf create mode 100644 gen/definitions/organization_firmware_upgrades.yaml create mode 100644 internal/provider/data_source_meraki_organization_firmware_upgrades.go create mode 100644 internal/provider/data_source_meraki_organization_firmware_upgrades_test.go create mode 100644 internal/provider/model_meraki_organization_firmware_upgrades.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 39a4177..5fe575e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Add `meraki_network_client_splash_authorization_status` resource and data source - Add `meraki_network_devices` data source - Add `meraki_organization_devices` data source +- Add `meraki_organization_firmware_upgrades` data source ## 0.1.2 diff --git a/docs/data-sources/organization_firmware_upgrades.md b/docs/data-sources/organization_firmware_upgrades.md new file mode 100644 index 0000000..c82f064 --- /dev/null +++ b/docs/data-sources/organization_firmware_upgrades.md @@ -0,0 +1,55 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "meraki_organization_firmware_upgrades Data Source - terraform-provider-meraki" +subcategory: "" +description: |- + This data source can read the Organization Firmware Upgrades configuration. +--- + +# meraki_organization_firmware_upgrades (Data Source) + +This data source can read the `Organization Firmware Upgrades` configuration. + +## Example Usage + +```terraform +data "meraki_organization_firmware_upgrades" "example" { + organization_id = "123456" +} +``` + + +## Schema + +### Required + +- `organization_id` (String) Organization ID + +### Read-Only + +- `items` (Attributes List) The list of items (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `items` + +Read-Only: + +- `completed_at` (String) Timestamp when upgrade completed. Null if status pending. +- `from_version_firmware` (String) Firmware name +- `from_version_id` (String) Firmware version ID +- `from_version_release_date` (String) Release date of the firmware version +- `from_version_release_type` (String) Release type of the firmware version +- `from_version_short_name` (String) Firmware version short name +- `id` (String) The id of the object +- `network_id` (String) ID of network +- `network_name` (String) The network +- `product_types` (String) product upgraded [wireless, appliance, switch, systemsManager, camera, cellularGateway, sensor] +- `status` (String) Status of upgrade event: [Cancelled, Completed] +- `time` (String) Scheduled start time +- `to_version_firmware` (String) Firmware name +- `to_version_id` (String) Firmware version ID +- `to_version_release_date` (String) Release date of the firmware version +- `to_version_release_type` (String) Release type of the firmware version +- `to_version_short_name` (String) Firmware version short name +- `upgrade_batch_id` (String) The upgrade batch +- `upgrade_id` (String) The upgrade diff --git a/docs/guides/changelog.md b/docs/guides/changelog.md index fba670c..398c133 100644 --- a/docs/guides/changelog.md +++ b/docs/guides/changelog.md @@ -29,6 +29,7 @@ description: |- - Add `meraki_network_client_splash_authorization_status` resource and data source - Add `meraki_network_devices` data source - Add `meraki_organization_devices` data source +- Add `meraki_organization_firmware_upgrades` data source ## 0.1.2 diff --git a/examples/data-sources/meraki_organization_firmware_upgrades/data-source.tf b/examples/data-sources/meraki_organization_firmware_upgrades/data-source.tf new file mode 100644 index 0000000..0c144cb --- /dev/null +++ b/examples/data-sources/meraki_organization_firmware_upgrades/data-source.tf @@ -0,0 +1,3 @@ +data "meraki_organization_firmware_upgrades" "example" { + organization_id = "123456" +} diff --git a/gen/definitions/organization_firmware_upgrades.yaml b/gen/definitions/organization_firmware_upgrades.yaml new file mode 100644 index 0000000..d956cd8 --- /dev/null +++ b/gen/definitions/organization_firmware_upgrades.yaml @@ -0,0 +1,107 @@ +name: Organization Firmware Upgrades +bulk_name: Organization Firmware Upgrades +spec_endpoint: /organizations/{organizationId}/firmware/upgrades +rest_endpoint: /organizations/%v/firmware/upgrades +no_data_source: true +no_resource: true +bulk_data_source: true +no_update: true +no_delete: true +doc_category: Organizations +test_variables: [test_org] +attributes: + - tf_name: organization_id + type: String + id: true + reference: true + description: Organization ID + example: "123456" + test_value: data.meraki_organization.test.id + - model_name: completedAt + type: String + description: Timestamp when upgrade completed. Null if status pending. + example: 2020-11-05 15:50:05 UTC + - model_name: productTypes + type: String + description: product upgraded [wireless, appliance, switch, systemsManager, camera, cellularGateway, sensor] + example: wireless + - model_name: status + type: String + description: 'Status of upgrade event: [Cancelled, Completed]' + example: Completed + - model_name: time + type: String + description: Scheduled start time + example: "2022-11-01T00:00:00Z" + - model_name: upgradeBatchId + type: String + description: The upgrade batch + example: "5678" + - model_name: upgradeId + type: String + description: The upgrade + example: "1234" + - model_name: firmware + type: String + data_path: [fromVersion] + description: Firmware name + example: wireless-11-2-1 + - model_name: id + type: String + data_path: [fromVersion] + description: Firmware version ID + example: "2887" + - model_name: releaseDate + type: String + data_path: [fromVersion] + description: Release date of the firmware version + example: "2022-03-17T17:22:52Z" + - model_name: releaseType + type: String + data_path: [fromVersion] + description: Release type of the firmware version + example: stable + - model_name: shortName + type: String + data_path: [fromVersion] + description: Firmware version short name + example: MR 11.2.1 + - model_name: id + type: String + data_path: [network] + description: ID of network + example: L_1738 + - model_name: name + type: String + data_path: [network] + description: The network + example: Minions + - model_name: firmware + type: String + data_path: [toVersion] + description: Firmware name + example: wireless-11-2-1 + - model_name: id + type: String + data_path: [toVersion] + description: Firmware version ID + example: "2888" + - model_name: releaseDate + type: String + data_path: [toVersion] + description: Release date of the firmware version + example: "2022-03-17T17:22:52Z" + - model_name: releaseType + type: String + data_path: [toVersion] + description: Release type of the firmware version + example: stable + - model_name: shortName + type: String + data_path: [toVersion] + description: Firmware version short name + example: MR 11.2.1 +test_prerequisites: |2 + data "meraki_organization" "test" { + name = var.test_org + } diff --git a/internal/provider/data_source_meraki_organization_firmware_upgrades.go b/internal/provider/data_source_meraki_organization_firmware_upgrades.go new file mode 100644 index 0000000..49e45ce --- /dev/null +++ b/internal/provider/data_source_meraki_organization_firmware_upgrades.go @@ -0,0 +1,190 @@ +// Copyright © 2024 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +package provider + +// Section below is generated&owned by "gen/generator.go". //template:begin imports +import ( + "context" + "fmt" + + "github.com/CiscoDevNet/terraform-provider-meraki/internal/provider/helpers" + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/netascode/go-meraki" +) + +// End of section. //template:end imports + +// Section below is generated&owned by "gen/generator.go". //template:begin model + +// Ensure the implementation satisfies the expected interfaces. +var ( + _ datasource.DataSource = &OrganizationFirmwareUpgradesDataSource{} + _ datasource.DataSourceWithConfigure = &OrganizationFirmwareUpgradesDataSource{} +) + +func NewOrganizationFirmwareUpgradesDataSource() datasource.DataSource { + return &OrganizationFirmwareUpgradesDataSource{} +} + +type OrganizationFirmwareUpgradesDataSource struct { + client *meraki.Client +} + +func (d *OrganizationFirmwareUpgradesDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_organization_firmware_upgrades" +} + +func (d *OrganizationFirmwareUpgradesDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = schema.Schema{ + // This description is used by the documentation generator and the language server. + MarkdownDescription: helpers.NewAttributeDescription("This data source can read the `Organization Firmware Upgrades` configuration.").String, + + Attributes: map[string]schema.Attribute{ + "organization_id": schema.StringAttribute{ + MarkdownDescription: "Organization ID", + Required: true, + }, + "items": schema.ListNestedAttribute{ + MarkdownDescription: "The list of items", + Computed: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "id": schema.StringAttribute{ + MarkdownDescription: "The id of the object", + Computed: true, + }, + "completed_at": schema.StringAttribute{ + MarkdownDescription: "Timestamp when upgrade completed. Null if status pending.", + Computed: true, + }, + "product_types": schema.StringAttribute{ + MarkdownDescription: "product upgraded [wireless, appliance, switch, systemsManager, camera, cellularGateway, sensor]", + Computed: true, + }, + "status": schema.StringAttribute{ + MarkdownDescription: "Status of upgrade event: [Cancelled, Completed]", + Computed: true, + }, + "time": schema.StringAttribute{ + MarkdownDescription: "Scheduled start time", + Computed: true, + }, + "upgrade_batch_id": schema.StringAttribute{ + MarkdownDescription: "The upgrade batch", + Computed: true, + }, + "upgrade_id": schema.StringAttribute{ + MarkdownDescription: "The upgrade", + Computed: true, + }, + "from_version_firmware": schema.StringAttribute{ + MarkdownDescription: "Firmware name", + Computed: true, + }, + "from_version_id": schema.StringAttribute{ + MarkdownDescription: "Firmware version ID", + Computed: true, + }, + "from_version_release_date": schema.StringAttribute{ + MarkdownDescription: "Release date of the firmware version", + Computed: true, + }, + "from_version_release_type": schema.StringAttribute{ + MarkdownDescription: "Release type of the firmware version", + Computed: true, + }, + "from_version_short_name": schema.StringAttribute{ + MarkdownDescription: "Firmware version short name", + Computed: true, + }, + "network_id": schema.StringAttribute{ + MarkdownDescription: "ID of network", + Computed: true, + }, + "network_name": schema.StringAttribute{ + MarkdownDescription: "The network", + Computed: true, + }, + "to_version_firmware": schema.StringAttribute{ + MarkdownDescription: "Firmware name", + Computed: true, + }, + "to_version_id": schema.StringAttribute{ + MarkdownDescription: "Firmware version ID", + Computed: true, + }, + "to_version_release_date": schema.StringAttribute{ + MarkdownDescription: "Release date of the firmware version", + Computed: true, + }, + "to_version_release_type": schema.StringAttribute{ + MarkdownDescription: "Release type of the firmware version", + Computed: true, + }, + "to_version_short_name": schema.StringAttribute{ + MarkdownDescription: "Firmware version short name", + Computed: true, + }, + }, + }, + }, + }, + } +} + +func (d *OrganizationFirmwareUpgradesDataSource) Configure(_ context.Context, req datasource.ConfigureRequest, _ *datasource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + + d.client = req.ProviderData.(*MerakiProviderData).Client +} + +// End of section. //template:end model + +// Section below is generated&owned by "gen/generator.go". //template:begin read + +func (d *OrganizationFirmwareUpgradesDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var config OrganizationFirmwareUpgrades + + // Read config + diags := req.Config.Get(ctx, &config) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("%s: Beginning Read", "OrganizationFirmwareUpgradesDataSource")) + + res, err := d.client.Get(config.getPath()) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Failed to retrieve object, got error: %s", err)) + return + } + + config.fromBody(ctx, res) + + tflog.Debug(ctx, fmt.Sprintf("%s: Read finished successfully", "OrganizationFirmwareUpgradesDataSource")) + + diags = resp.State.Set(ctx, &config) + resp.Diagnostics.Append(diags...) +} + +// End of section. //template:end read diff --git a/internal/provider/data_source_meraki_organization_firmware_upgrades_test.go b/internal/provider/data_source_meraki_organization_firmware_upgrades_test.go new file mode 100644 index 0000000..b2cd832 --- /dev/null +++ b/internal/provider/data_source_meraki_organization_firmware_upgrades_test.go @@ -0,0 +1,71 @@ +// Copyright © 2024 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +package provider + +// Section below is generated&owned by "gen/generator.go". //template:begin imports +import ( + "os" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +// End of section. //template:end imports + +// Section below is generated&owned by "gen/generator.go". //template:begin testAccDataSource + +func TestAccDataSourceMerakiOrganizationFirmwareUpgrades(t *testing.T) { + if os.Getenv("TF_VAR_test_org") == "" { + t.Skip("skipping test, set environment variable TF_VAR_test_org") + } + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceMerakiOrganizationFirmwareUpgradesPrerequisitesConfig + testAccDataSourceMerakiOrganizationFirmwareUpgradesConfig(), + }, + }, + }) +} + +// End of section. //template:end testAccDataSource + +// Section below is generated&owned by "gen/generator.go". //template:begin testPrerequisites + +const testAccDataSourceMerakiOrganizationFirmwareUpgradesPrerequisitesConfig = ` +variable "test_org" {} +data "meraki_organization" "test" { + name = var.test_org +} + +` + +// End of section. //template:end testPrerequisites + +// Section below is generated&owned by "gen/generator.go". //template:begin testAccDataSourceConfig + +func testAccDataSourceMerakiOrganizationFirmwareUpgradesConfig() string { + config := `data "meraki_organization_firmware_upgrades" "test" { + organization_id = data.meraki_organization.test.id + } + ` + return config +} + +// End of section. //template:end testAccDataSourceConfig diff --git a/internal/provider/model_meraki_organization_firmware_upgrades.go b/internal/provider/model_meraki_organization_firmware_upgrades.go new file mode 100644 index 0000000..c68959b --- /dev/null +++ b/internal/provider/model_meraki_organization_firmware_upgrades.go @@ -0,0 +1,175 @@ +// Copyright © 2024 Cisco Systems, Inc. and its affiliates. +// All rights reserved. +// +// Licensed under the Mozilla Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: MPL-2.0 + +package provider + +// Section below is generated&owned by "gen/generator.go". //template:begin imports +import ( + "context" + "fmt" + "net/url" + + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/netascode/go-meraki" + "github.com/tidwall/gjson" +) + +// End of section. //template:end imports + +// Section below is generated&owned by "gen/generator.go". //template:begin types + +type OrganizationFirmwareUpgrades struct { + OrganizationId types.String `tfsdk:"organization_id"` + Items []OrganizationFirmwareUpgradesItems `tfsdk:"items"` +} + +type OrganizationFirmwareUpgradesItems struct { + Id types.String `tfsdk:"id"` + CompletedAt types.String `tfsdk:"completed_at"` + ProductTypes types.String `tfsdk:"product_types"` + Status types.String `tfsdk:"status"` + Time types.String `tfsdk:"time"` + UpgradeBatchId types.String `tfsdk:"upgrade_batch_id"` + UpgradeId types.String `tfsdk:"upgrade_id"` + FromVersionFirmware types.String `tfsdk:"from_version_firmware"` + FromVersionId types.String `tfsdk:"from_version_id"` + FromVersionReleaseDate types.String `tfsdk:"from_version_release_date"` + FromVersionReleaseType types.String `tfsdk:"from_version_release_type"` + FromVersionShortName types.String `tfsdk:"from_version_short_name"` + NetworkId types.String `tfsdk:"network_id"` + NetworkName types.String `tfsdk:"network_name"` + ToVersionFirmware types.String `tfsdk:"to_version_firmware"` + ToVersionId types.String `tfsdk:"to_version_id"` + ToVersionReleaseDate types.String `tfsdk:"to_version_release_date"` + ToVersionReleaseType types.String `tfsdk:"to_version_release_type"` + ToVersionShortName types.String `tfsdk:"to_version_short_name"` +} + +// End of section. //template:end types + +// Section below is generated&owned by "gen/generator.go". //template:begin getPath + +func (data OrganizationFirmwareUpgrades) getPath() string { + return fmt.Sprintf("/organizations/%v/firmware/upgrades", url.QueryEscape(data.OrganizationId.ValueString())) +} + +// End of section. //template:end getPath + +// Section below is generated&owned by "gen/generator.go". //template:begin fromBody + +func (data *OrganizationFirmwareUpgrades) fromBody(ctx context.Context, res meraki.Res) { + data.Items = make([]OrganizationFirmwareUpgradesItems, 0) + res.ForEach(func(k, res gjson.Result) bool { + parent := &data + data := OrganizationFirmwareUpgradesItems{} + data.Id = types.StringValue(res.Get("").String()) + if value := res.Get("completedAt"); value.Exists() && value.Value() != nil { + data.CompletedAt = types.StringValue(value.String()) + } else { + data.CompletedAt = types.StringNull() + } + if value := res.Get("productTypes"); value.Exists() && value.Value() != nil { + data.ProductTypes = types.StringValue(value.String()) + } else { + data.ProductTypes = types.StringNull() + } + if value := res.Get("status"); value.Exists() && value.Value() != nil { + data.Status = types.StringValue(value.String()) + } else { + data.Status = types.StringNull() + } + if value := res.Get("time"); value.Exists() && value.Value() != nil { + data.Time = types.StringValue(value.String()) + } else { + data.Time = types.StringNull() + } + if value := res.Get("upgradeBatchId"); value.Exists() && value.Value() != nil { + data.UpgradeBatchId = types.StringValue(value.String()) + } else { + data.UpgradeBatchId = types.StringNull() + } + if value := res.Get("upgradeId"); value.Exists() && value.Value() != nil { + data.UpgradeId = types.StringValue(value.String()) + } else { + data.UpgradeId = types.StringNull() + } + if value := res.Get("fromVersion.firmware"); value.Exists() && value.Value() != nil { + data.FromVersionFirmware = types.StringValue(value.String()) + } else { + data.FromVersionFirmware = types.StringNull() + } + if value := res.Get("fromVersion.id"); value.Exists() && value.Value() != nil { + data.FromVersionId = types.StringValue(value.String()) + } else { + data.FromVersionId = types.StringNull() + } + if value := res.Get("fromVersion.releaseDate"); value.Exists() && value.Value() != nil { + data.FromVersionReleaseDate = types.StringValue(value.String()) + } else { + data.FromVersionReleaseDate = types.StringNull() + } + if value := res.Get("fromVersion.releaseType"); value.Exists() && value.Value() != nil { + data.FromVersionReleaseType = types.StringValue(value.String()) + } else { + data.FromVersionReleaseType = types.StringNull() + } + if value := res.Get("fromVersion.shortName"); value.Exists() && value.Value() != nil { + data.FromVersionShortName = types.StringValue(value.String()) + } else { + data.FromVersionShortName = types.StringNull() + } + if value := res.Get("network.id"); value.Exists() && value.Value() != nil { + data.NetworkId = types.StringValue(value.String()) + } else { + data.NetworkId = types.StringNull() + } + if value := res.Get("network.name"); value.Exists() && value.Value() != nil { + data.NetworkName = types.StringValue(value.String()) + } else { + data.NetworkName = types.StringNull() + } + if value := res.Get("toVersion.firmware"); value.Exists() && value.Value() != nil { + data.ToVersionFirmware = types.StringValue(value.String()) + } else { + data.ToVersionFirmware = types.StringNull() + } + if value := res.Get("toVersion.id"); value.Exists() && value.Value() != nil { + data.ToVersionId = types.StringValue(value.String()) + } else { + data.ToVersionId = types.StringNull() + } + if value := res.Get("toVersion.releaseDate"); value.Exists() && value.Value() != nil { + data.ToVersionReleaseDate = types.StringValue(value.String()) + } else { + data.ToVersionReleaseDate = types.StringNull() + } + if value := res.Get("toVersion.releaseType"); value.Exists() && value.Value() != nil { + data.ToVersionReleaseType = types.StringValue(value.String()) + } else { + data.ToVersionReleaseType = types.StringNull() + } + if value := res.Get("toVersion.shortName"); value.Exists() && value.Value() != nil { + data.ToVersionShortName = types.StringValue(value.String()) + } else { + data.ToVersionShortName = types.StringNull() + } + (*parent).Items = append((*parent).Items, data) + return true + }) +} + +// End of section. //template:end fromBody diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 38a0144..733b0b7 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -449,6 +449,7 @@ func (p *MerakiProvider) DataSources(ctx context.Context) []func() datasource.Da NewOrganizationEarlyAccessFeaturesDataSource, NewOrganizationEarlyAccessFeaturesOptInDataSource, NewOrganizationEarlyAccessFeaturesOptInsDataSource, + NewOrganizationFirmwareUpgradesDataSource, NewOrganizationLicenseDataSource, NewOrganizationLicensesDataSource, NewOrganizationLoginSecurityDataSource, diff --git a/templates/guides/changelog.md.tmpl b/templates/guides/changelog.md.tmpl index fba670c..398c133 100644 --- a/templates/guides/changelog.md.tmpl +++ b/templates/guides/changelog.md.tmpl @@ -29,6 +29,7 @@ description: |- - Add `meraki_network_client_splash_authorization_status` resource and data source - Add `meraki_network_devices` data source - Add `meraki_organization_devices` data source +- Add `meraki_organization_firmware_upgrades` data source ## 0.1.2