@@ -29,7 +29,6 @@ import (
2929 "strings"
3030 "time"
3131
32- "github.com/PureStorage-OpenConnect/terraform-provider-cbs/cbs/internal/appcatalog"
3332 "github.com/hashicorp/go-version"
3433 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
3534 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -67,6 +66,39 @@ func dataSourceAzurePlans() *schema.Resource {
6766 }
6867}
6968
69+ func dataSourceCbsPlanAzure () * schema.Resource {
70+ return & schema.Resource {
71+ ReadContext : dataSourceCbsPlanAzureRead ,
72+ Schema : map [string ]* schema.Schema {
73+ "plan_version" : {
74+ Type : schema .TypeString ,
75+ Required : true ,
76+ ValidateFunc : validateVersionPrefixTag ,
77+ },
78+ "name" : {
79+ Type : schema .TypeString ,
80+ Computed : true ,
81+ Elem : schema .TypeString ,
82+ },
83+ "version" : {
84+ Type : schema .TypeString ,
85+ Computed : true ,
86+ Elem : schema .TypeString ,
87+ },
88+ "publisher" : {
89+ Type : schema .TypeString ,
90+ Computed : true ,
91+ Elem : schema .TypeString ,
92+ },
93+ "product" : {
94+ Type : schema .TypeString ,
95+ Computed : true ,
96+ Elem : schema .TypeString ,
97+ },
98+ },
99+ }
100+ }
101+
70102type Plan struct {
71103 Name string
72104 Product string
@@ -96,7 +128,7 @@ func (a PlanByVersion) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
96128var plan_name_regexp = regexp .MustCompile (`^[\w]+_([\d]+)_([\d]+)_([\d]+)$` )
97129
98130// Retrieve a plan information from Azure DefaultTemplate artifact
99- func getPlanFromTemplateJson (data []byte ) (* Plan , error ) {
131+ func GetPlanFromTemplateJson (data []byte ) (* Plan , error ) {
100132 // Parse the default template
101133 var unmarshalled_data JSONDefaultTemplate
102134 err := json .Unmarshal (data , & unmarshalled_data )
@@ -131,16 +163,14 @@ func versionPlans(plans []Plan) ([]VersionedPlan, error) {
131163 return versioned_plans , nil
132164}
133165
134- func queryMarketplaceForPlans (ctx context.Context ) ([]VersionedPlan , error ) {
135-
136- search_client := appcatalog .NewSearchClient ()
137- response , err := search_client .Get (ctx , "en" , "US" , "terraform-cbs-provider" , []appcatalog.SearchV2FieldName {"All" }, []string {"purestoragemarketplaceadmin" })
166+ func QueryMarketplaceForPlans (ctx context.Context ) ([]VersionedPlan , error ) {
167+ productSummary , err := GetProductSummary (ctx )
138168 if err != nil {
139169 return nil , err
140170 }
141171
142172 var template_plans []Plan
143- for _ , response_result := range response .Results {
173+ for _ , response_result := range productSummary .Results {
144174 for _ , response_plan := range response_result .Plans {
145175 if ! strings .HasPrefix (* response_plan .PlanID , "cbs_azure" ) {
146176 // Exclude any plans which aren't the Pure Cloud Block Store on Azure offering.
@@ -158,7 +188,7 @@ func queryMarketplaceForPlans(ctx context.Context) ([]VersionedPlan, error) {
158188 continue
159189 }
160190
161- template_plan , err := getPlanFromTemplateJson (template_data )
191+ template_plan , err := GetPlanFromTemplateJson (template_data )
162192 if err != nil {
163193 continue
164194 }
@@ -174,7 +204,7 @@ func queryMarketplaceForPlans(ctx context.Context) ([]VersionedPlan, error) {
174204func dataSourceAzurePlansRead (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
175205 var diags diag.Diagnostics
176206
177- versioned_plans , err := queryMarketplaceForPlans (ctx )
207+ versioned_plans , err := QueryMarketplaceForPlans (ctx )
178208 if err != nil {
179209 return diag .FromErr (err )
180210 }
@@ -201,3 +231,50 @@ func dataSourceAzurePlansRead(ctx context.Context, d *schema.ResourceData, m int
201231
202232 return diags
203233}
234+
235+ func dataSourceCbsPlanAzureRead (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
236+ var diags diag.Diagnostics
237+
238+ versioned_plans , err := QueryMarketplaceForPlans (ctx )
239+ if err != nil {
240+ return diag .FromErr (err )
241+ }
242+
243+ version_prefix_tag := d .Get ("plan_version" ).(string )
244+ if version_prefix_tag [len (version_prefix_tag )- 1 ] == 'x' {
245+ version_prefix_tag = version_prefix_tag [0 : len (version_prefix_tag )- 1 ]
246+ }
247+
248+ set := false
249+ for _ , versioned_plan := range versioned_plans {
250+ match := plan_name_regexp .FindStringSubmatch (versioned_plan .Plan .Name )
251+ version_tag := fmt .Sprintf ("%s.%s.%s" , match [1 ], match [2 ], match [3 ])
252+ if strings .HasPrefix (version_tag , version_prefix_tag ) {
253+ d .SetId (strconv .FormatInt (time .Now ().Unix (), 10 ))
254+ err = d .Set ("name" , versioned_plan .Plan .Name )
255+ if err != nil {
256+ return diag .FromErr (err )
257+ }
258+ err = d .Set ("product" , versioned_plan .Plan .Product )
259+ if err != nil {
260+ return diag .FromErr (err )
261+ }
262+ err = d .Set ("publisher" , versioned_plan .Plan .Publisher )
263+ if err != nil {
264+ return diag .FromErr (err )
265+ }
266+ err = d .Set ("version" , versioned_plan .Plan .Version )
267+ if err != nil {
268+ return diag .FromErr (err )
269+ }
270+ set = true
271+ break
272+ }
273+ }
274+
275+ if ! set {
276+ return diag .FromErr (errors .New ("Specific plan for provided version tag not found" ))
277+ }
278+
279+ return diags
280+ }
0 commit comments