Skip to content

Commit

Permalink
Allow subproduct to process a single major version (#9)
Browse files Browse the repository at this point in the history
* simplified driver subproducts

* added major version base
existing code working

* finished logic to process a single major version for a subproduct

* bump go version in actions

---------

Co-authored-by: Matt Proud <laidbackware.git@gmail.com>
  • Loading branch information
laidbackware and Matt Proud committed Dec 8, 2023
1 parent 713cae3 commit 81519e7
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 43 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19.5
go-version: 1.21.4

- name: Checkout Code
uses: actions/checkout@v3
Expand Down
43 changes: 21 additions & 22 deletions sdk/subproduct_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,29 @@ import (

func TestGetSubProductsSlice(t *testing.T) {
var subProducts []SubProductDetails
subProducts, err = basicClient.GetSubProductsSlice("vmware_horizon", "PRODUCT_BINARY")
subProducts, err = basicClient.GetSubProductsSlice("vmware_horizon", "PRODUCT_BINARY", "")
assert.Nil(t, err)
assert.GreaterOrEqual(t, len(subProducts), 20, "Expected response to contain at least 20 items")
}

func TestGetSubProductsSliceDrivers(t *testing.T) {
var subProducts []SubProductDetails
subProducts, err = basicClient.GetSubProductsSlice("vmware_vsphere", "DRIVERS_TOOLS")
subProducts, err = basicClient.GetSubProductsSlice("vmware_vsphere", "DRIVERS_TOOLS", "")
assert.Nil(t, err)
assert.GreaterOrEqual(t, len(subProducts), 20, "Expected response to contain at least 20 items")
assert.GreaterOrEqual(t, len(subProducts), 400, "Expected response to contain at least 200 items")

// Ensure less results are returned after specifying majpor version
subProducts, err = basicClient.GetSubProductsSlice("vmware_vsphere", "DRIVERS_TOOLS", "8_0")
assert.Nil(t, err)
assert.GreaterOrEqual(t, len(subProducts), 100, "Expected response to contain at least 100 items")
assert.LessOrEqual(t, len(subProducts), 400, "Expected response to contain less than 400 items")
}

func TestGetSubProductsSliceInvalidSlug(t *testing.T) {
var subProducts []SubProductDetails
subProducts, err = basicClient.GetSubProductsSlice("vsphere", "PRODUCT_BINARY", "")
assert.ErrorIs(t, err, ErrorInvalidSlug)
assert.Empty(t, subProducts, "Expected response to be empty")
}

func TestGetSubProductNsxLE(t *testing.T) {
Expand All @@ -32,37 +45,23 @@ func TestGetSubProductNsxLE(t *testing.T) {
assert.Greater(t, len(subProduct.DlgListByVersion), 0)
}

// func TestGetSubProduct(t *testing.T) {
// var subProduct SubProductDetails
// subProduct, err = basicClient.GetSubProduct("vmware_vsphere", "dem+standard", "PRODUCT_BINARY")
// assert.Nil(t, err)
// assert.NotEmpty(t, subProduct.ProductName)
// }

func TestGetSubProductDriver(t *testing.T) {
var subProduct SubProductDetails
subProduct, err = basicClient.GetSubProduct("vmware_horizon", "dem+standard", "PRODUCT_BINARY")
assert.Nil(t, err)
assert.NotEmpty(t, subProduct.ProductName)
}

func TestGetSubProductsSliceInvalidSlug(t *testing.T) {
var subProducts []SubProductDetails
subProducts, err = basicClient.GetSubProductsSlice("vsphere", "PRODUCT_BINARY")
assert.ErrorIs(t, err, ErrorInvalidSlug)
assert.Empty(t, subProducts, "Expected response to be empty")
}

func TestGetSubProductsMap(t *testing.T) {
var subProducts map[string]SubProductDetails
subProducts, err = basicClient.GetSubProductsMap("vmware_vsphere", "PRODUCT_BINARY")
subProducts, err = basicClient.GetSubProductsMap("vmware_vsphere", "PRODUCT_BINARY", "")
assert.Nil(t, err)
assert.Contains(t, subProducts, "vmtools")
}

func TestGetSubProductsMapHorizon(t *testing.T) {
var subProducts map[string]SubProductDetails
subProducts, err = basicClient.GetSubProductsMap("vmware_horizon_clients", "PRODUCT_BINARY")
subProducts, err = basicClient.GetSubProductsMap("vmware_horizon_clients", "PRODUCT_BINARY", "")
assert.Nil(t, err)
assert.Contains(t, subProducts, "cart+win")
assert.Contains(t, subProducts, "cart+andrd_x8632")
Expand All @@ -71,23 +70,23 @@ func TestGetSubProductsMapHorizon(t *testing.T) {

func TestGetSubProductsMapNsxLe(t *testing.T) {
var subProducts map[string]SubProductDetails
subProducts, err = basicClient.GetSubProductsMap("vmware_nsx", "PRODUCT_BINARY")
subProducts, err = basicClient.GetSubProductsMap("vmware_nsx", "PRODUCT_BINARY", "")
assert.Nil(t, err)
assert.Contains(t, subProducts, "nsx")
assert.Contains(t, subProducts, "nsx_le")
}

func TestGetSubProductsMapNsxTLe(t *testing.T) {
var subProducts map[string]SubProductDetails
subProducts, err = basicClient.GetSubProductsMap("vmware_nsx_t_data_center", "PRODUCT_BINARY")
subProducts, err = basicClient.GetSubProductsMap("vmware_nsx_t_data_center", "PRODUCT_BINARY", "")
assert.Nil(t, err)
assert.Contains(t, subProducts, "nsx-t")
assert.Contains(t, subProducts, "nsx-t_le")
}

func TestGetSubProductsMapInvalidSlug(t *testing.T) {
var subProductMap map[string]SubProductDetails
subProductMap, err = basicClient.GetSubProductsMap("vsphere", "PRODUCT_BINARY")
subProductMap, err = basicClient.GetSubProductsMap("vsphere", "PRODUCT_BINARY", "" )
assert.ErrorIs(t, err, ErrorInvalidSlug)
assert.Empty(t, subProductMap, "Expected response to be empty")
}
Expand Down
57 changes: 37 additions & 20 deletions sdk/subproducts.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package sdk
import (
"errors"
"regexp"
"slices"
"sort"
"strings"
)
Expand All @@ -24,35 +25,53 @@ type SubProductSliceElement struct {
var ErrorInvalidSubProduct = errors.New("subproduct: invalid subproduct requested")
var ErrorInvalidSubProductMajorVersion = errors.New("subproduct: invalid major version requested")

func (c *Client) GetSubProductsMap(slug, dlgType string) (subProductMap map[string]SubProductDetails, err error) {
func (c *Client) GetSubProductsMap(slug, dlgType, requestedMajorVersion string) (subProductMap map[string]SubProductDetails, err error) {
c.EnsureProductDetailMap()
if err != nil {
return
}

if _, ok := ProductDetailMap[slug]; !ok {
err = ErrorInvalidSlug
return
}

subProductMap = make(map[string]SubProductDetails)

var majorVersions []string
majorVersions, err = c.GetMajorVersionsSlice(slug)
if err != nil {
return
}

// Iterate major product versions and extract all unique products
// All version information is stripped
for _, majorVersion := range majorVersions {
var dlgEditionsList []DlgEditionsLists
subProductMap = make(map[string]SubProductDetails)

// Only process requested major version, otherwise process all for slug
if requestedMajorVersion != "" {
if !slices.Contains(majorVersions, requestedMajorVersion) {
err = ErrorInvalidSubProductMajorVersion
return
}
err = c.processMajorVersion(slug, requestedMajorVersion, dlgType, subProductMap)
if err != nil {
return
}
} else {
// Iterate major product versions and extract all unique products
// All version information is stripped
for _, majorVersion := range majorVersions {
c.processMajorVersion(slug, majorVersion, dlgType, subProductMap)
// Invalid version errors need to be ignored, as they come from deprecated products
if err == ErrorInvalidVersion {
err = nil
} else if err != nil {
return
}
}
}
return
}

func (c *Client) processMajorVersion (slug, majorVersion, dlgType string, subProductMap map[string]SubProductDetails) (err error) {
var dlgEditionsList []DlgEditionsLists
dlgEditionsList, err = c.GetDlgEditionsList(slug, majorVersion, dlgType)
// Invalid version errors need to be ignored, as they come from deprecated products
if err == ErrorInvalidVersion {
err = nil
continue
} else if err != nil {
if err != nil {
return
}

Expand Down Expand Up @@ -80,7 +99,6 @@ func (c *Client) GetSubProductsMap(slug, dlgType string) (subProductMap map[stri
}
}
}
}
return
}

Expand Down Expand Up @@ -160,9 +178,8 @@ func duplicateNsxToNsxLe(subProductMap map[string]SubProductDetails, productCode
subProductMap[productCode + "_le"].DlgListByVersion[majorVersion] = dlgList
}


func (c *Client) GetSubProductsSlice(slug, dlgType string) (data []SubProductDetails, err error) {
subProductMap, err := c.GetSubProductsMap(slug, dlgType)
func (c *Client) GetSubProductsSlice(slug, dlgType, majorVersion string) (data []SubProductDetails, err error) {
subProductMap, err := c.GetSubProductsMap(slug, dlgType, majorVersion)
if err != nil {
return
}
Expand All @@ -186,7 +203,7 @@ func (c *Client) GetSubProductsSlice(slug, dlgType string) (data []SubProductDet

func (c *Client) GetSubProduct(slug, subProduct, dlgType string) (data SubProductDetails, err error) {
var subProductMap map[string]SubProductDetails
subProductMap, err = c.GetSubProductsMap(slug, dlgType)
subProductMap, err = c.GetSubProductsMap(slug, dlgType, "")
if err != nil {
return
}
Expand All @@ -202,7 +219,7 @@ func (c *Client) GetSubProduct(slug, subProduct, dlgType string) (data SubProduc

func (c *Client) GetSubProductDetails(slug, subProduct, majorVersion, dlgType string) (data DlgList, err error) {
var subProducts map[string]SubProductDetails
subProducts, err = c.GetSubProductsMap(slug, dlgType)
subProducts, err = c.GetSubProductsMap(slug, dlgType, "")
if err != nil {
return
}
Expand Down

0 comments on commit 81519e7

Please sign in to comment.