@@ -3,6 +3,11 @@ package spectrocloud
33import (
44 "context"
55 "fmt"
6+ "github.com/Masterminds/semver/v3"
7+ "github.com/spectrocloud/gomi/pkg/ptr"
8+ "github.com/spectrocloud/palette-sdk-go/api/models"
9+ "github.com/spectrocloud/palette-sdk-go/client"
10+ "sort"
611 "strings"
712
813 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -46,7 +51,7 @@ func dataSourcePack() *schema.Resource {
4651 },
4752 "version" : {
4853 Type : schema .TypeString ,
49- Description : "The version of the pack to search for." ,
54+ Description : "Specifies the version of the pack to search for. If not set, the latest available version from the specified registry will be used ." ,
5055 Computed : true ,
5156 Optional : true ,
5257 },
@@ -73,6 +78,7 @@ func dataSourcePack() *schema.Resource {
7378
7479func dataSourcePackRead (_ context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
7580 c := getV1ClientWithResourceContext (m , "" )
81+ var packName = ""
7682
7783 // Warning or errors can be collected in a slice type
7884 var diags diag.Diagnostics
@@ -115,17 +121,24 @@ func dataSourcePackRead(_ context.Context, d *schema.ResourceData, m interface{}
115121 and first part would be any random name to make overall pack name unique and 2nd part is actual pack name.
116122 Thus, splitting pack name with '--' to get the correct pack name to find pack uuid
117123 */
124+
118125 if strings .Contains (v .(string ), "--" ) {
119126 v = strings .Split (v .(string ), "--" )[1 ]
120127 }
128+ packName = v .(string )
121129 filters = append (filters , fmt .Sprintf ("spec.name=%s" , v .(string )))
122130 }
123- if v , ok := d .GetOk ("version" ); ok {
124- filters = append (filters , fmt .Sprintf ("spec.version=%s" , v .(string )))
125- }
126131 if v , ok := d .GetOk ("registry_uid" ); ok {
127132 registryUID = v .(string )
128133 }
134+ if v , ok := d .GetOk ("version" ); ok {
135+ filters = append (filters , fmt .Sprintf ("spec.version=%s" , v .(string )))
136+ } else {
137+ latestVersion := setLatestPackVersionToFilters (packName , registryUID , c )
138+ if latestVersion != "" {
139+ filters = append (filters , fmt .Sprintf ("spec.version=%s" , latestVersion ))
140+ }
141+ }
129142 if v , ok := d .GetOk ("cloud" ); ok {
130143 clouds := expandStringList (v .(* schema.Set ).List ())
131144 if ! stringContains (clouds , "all" ) {
@@ -140,7 +153,7 @@ func dataSourcePackRead(_ context.Context, d *schema.ResourceData, m interface{}
140153 return diag .FromErr (err )
141154 }
142155
143- packName : = "unknown"
156+ packName = "unknown"
144157 if v , ok := d .GetOk ("name" ); ok {
145158 packName = v .(string )
146159 }
@@ -196,3 +209,49 @@ func dataSourcePackRead(_ context.Context, d *schema.ResourceData, m interface{}
196209
197210 return diags
198211}
212+
213+ func setLatestPackVersionToFilters (packName string , registryUID string , c * client.V1Client ) string {
214+ var packLayers = []models.V1PackLayer {"addon" , "csi" , "cni" , "os" , "kernel" }
215+ var packTypes = []models.V1PackType {"spectro" , "helm" , "manifest" , "oci" }
216+ var packAddOnTypes = []string {"load balancer" , "ingress" , "logging" , "monitoring" , "security" , "authentication" ,
217+ "servicemesh" , "system app" , "app services" , "registry" , "csi" , "cni" , "integration" , "" }
218+
219+ newFilter := & models.V1PackFilterSpec {
220+ Name : & models.V1FilterString {
221+ Eq : ptr .StringPtr (packName ),
222+ },
223+ Type : packTypes ,
224+ Layer : packLayers ,
225+ Environment : []string {"all" },
226+ AddOnType : packAddOnTypes ,
227+ }
228+ if registryUID != "" {
229+ newFilter .RegistryUID = []string {registryUID }
230+ }
231+ var newSort []* models.V1PackSortSpec
232+ latestVersion := ""
233+ packsResults , _ := c .SearchPacks (newFilter , newSort )
234+ if len (packsResults ) == 1 {
235+ latestVersion , _ = getLatestVersion (packsResults [0 ].Spec .Registries )
236+ return latestVersion
237+ }
238+ return ""
239+ }
240+
241+ // getLatestVersion returns the latest version from a list of version strings.
242+ func getLatestVersion (versions []* models.V1RegistryPackMetadata ) (string , error ) {
243+ if len (versions ) == 0 {
244+ return "" , fmt .Errorf ("no versions provided" )
245+ }
246+ semverVersions := make ([]* semver.Version , len (versions ))
247+ for i , v := range versions {
248+ ver , err := semver .NewVersion (v .LatestVersion )
249+ if err != nil {
250+ return "" , fmt .Errorf ("invalid version %q: %w" , v , err )
251+ }
252+ semverVersions [i ] = ver
253+ }
254+ sort .Sort (semver .Collection (semverVersions ))
255+
256+ return semverVersions [len (semverVersions )- 1 ].String (), nil
257+ }
0 commit comments