Skip to content

Commit

Permalink
Merge pull request #100 from uc-cdis/fix/handle-nil-licensed-users-in…
Browse files Browse the repository at this point in the history
…-terminate

Fix/handle nil licensed users in terminate
  • Loading branch information
george42-ctds authored Mar 20, 2024
2 parents 4a49622 + 063bd8f commit bc871cd
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 61 deletions.
4 changes: 2 additions & 2 deletions hatchery/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,8 @@ func LoadConfig(configFilePath string, loggerIn *log.Logger) (config *FullHatche
data.Logger.Printf("Error in configuration: %v", err)
return nil, err
}
ok := validateContainerLicenseInfo(container.Name, container.License)
if !ok {
err := validateContainerLicenseInfo(container.Name, container.License)
if err != nil {
err = fmt.Errorf("container '%s' has an invalid 'license' configuration", container.Name)
data.Logger.Printf("Error in configuration: %v", err)
return nil, err
Expand Down
63 changes: 43 additions & 20 deletions hatchery/gen3licenseusermaps.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package hatchery

import (
"context"
"errors"
"fmt"
"os"
"strconv"
Expand Down Expand Up @@ -46,9 +47,10 @@ var initializeDbConfig = func() *DbConfig {
}
}

var validateContainerLicenseInfo = func(containerName string, licenseInfo LicenseInfo) bool {
var validateContainerLicenseInfo = func(containerName string, licenseInfo LicenseInfo) error {

ok := true
var ok = true
// print any items that are missing from LicenseInfo
if !licenseInfo.Enabled {
fmt.Printf("Warning: License is not enabled for container %s\n", containerName)
ok = false
Expand Down Expand Up @@ -77,7 +79,11 @@ var validateContainerLicenseInfo = func(containerName string, licenseInfo Licens
fmt.Printf("Error in container config. Empty WorkspaceFlavor for container %s\n", containerName)
ok = false
}
return ok
if ok {
return nil
} else {
return errors.New("container LicenseInfo is misconfigured")
}
}

func getItemsFromQuery(dbconfig *DbConfig, queryInput *dynamodb.QueryInput) ([]map[string]*dynamodb.AttributeValue, error) {
Expand All @@ -99,11 +105,20 @@ func getItemsFromQuery(dbconfig *DbConfig, queryInput *dynamodb.QueryInput) ([]m
return tableItems, nil
}

var getActiveGen3LicenseUserMaps = func(dbconfig *DbConfig, container Container) (gen3LicenseUserMaps *[]Gen3LicenseUserMap, err error) {
var getActiveGen3LicenseUserMaps = func(dbconfig *DbConfig, container Container) (gen3LicenseUserMaps []Gen3LicenseUserMap, err error) {
// Query the table to get all active gen3 license user map items
emptyList := []Gen3LicenseUserMap{}

targetEnvironment := os.Getenv("GEN3_ENDPOINT")
validateContainerLicenseInfo(container.Name, container.License)
err = validateContainerLicenseInfo(container.Name, container.License)
if err != nil {
Config.Logger.Printf("Gen3License table info for container is not configured or is misconfigured.")
return emptyList, nil
}
if Config.Config.LicenseUserMapsTable == "" || Config.Config.LicenseUserMapsGSI == "" {
Config.Logger.Printf("Gen3License table info is not configured.")
return emptyList, nil
}

// Query on global secondary index and filter by license type (eg. "STATA")
keyEx1 := expression.Key("environment").Equal(expression.Value(aws.String(targetEnvironment)))
Expand All @@ -112,7 +127,7 @@ var getActiveGen3LicenseUserMaps = func(dbconfig *DbConfig, container Container)
expr, err := expression.NewBuilder().WithKeyCondition(expression.KeyAnd(keyEx1, keyEx2)).WithFilter(filt).Build()
if err != nil {
Config.Logger.Printf("Error in building expression for query: %s", err)
return nil, err
return emptyList, err
}
queryUserMapsInput := &dynamodb.QueryInput{
TableName: aws.String(Config.Config.LicenseUserMapsTable),
Expand All @@ -125,24 +140,29 @@ var getActiveGen3LicenseUserMaps = func(dbconfig *DbConfig, container Container)
licenseUserMapItems, err := getItemsFromQuery(dbconfig, queryUserMapsInput)
if err != nil {
Config.Logger.Printf("Error in active user query: %s", err)
return nil, err
return emptyList, err
}

// Populate list of all active gen3 license user maps
var gen3LicenseUsers []Gen3LicenseUserMap
err = dynamodbattribute.UnmarshalListOfMaps(licenseUserMapItems, &gen3LicenseUsers)
if err != nil {
Config.Logger.Printf("Error in unmarshalling active gen3 license user maps: %s", err)
return nil, err
return emptyList, err
}
Config.Logger.Printf("Debug: active gen3 license user maps %v", gen3LicenseUsers)
return &gen3LicenseUsers, nil
return gen3LicenseUsers, nil
}

var getLicenseUserMapsForUser = func(dbconfig *DbConfig, userId string) (gen3LicenseUserMaps *[]Gen3LicenseUserMap, err error) {
var getLicenseUserMapsForUser = func(dbconfig *DbConfig, userId string) (gen3LicenseUserMaps []Gen3LicenseUserMap, err error) {
// Query the table to get all gen3 license user map items for user
emptyList := []Gen3LicenseUserMap{}

targetEnvironment := os.Getenv("GEN3_ENDPOINT")
if Config.Config.LicenseUserMapsTable == "" || Config.Config.LicenseUserMapsGSI == "" {
Config.Logger.Printf("Gen3License table info is not configured.")
return emptyList, nil
}

// Query on global secondary index and filter by userId
keyEx1 := expression.Key("environment").Equal(expression.Value(aws.String(targetEnvironment)))
Expand All @@ -151,7 +171,7 @@ var getLicenseUserMapsForUser = func(dbconfig *DbConfig, userId string) (gen3Lic
expr, err := expression.NewBuilder().WithKeyCondition(expression.KeyAnd(keyEx1, keyEx2)).WithFilter(filt).Build()
if err != nil {
Config.Logger.Printf("Error in building expression for query: %s", err)
return nil, err
return emptyList, err
}
queryUserMapsInput := &dynamodb.QueryInput{
TableName: aws.String(Config.Config.LicenseUserMapsTable),
Expand All @@ -164,29 +184,29 @@ var getLicenseUserMapsForUser = func(dbconfig *DbConfig, userId string) (gen3Lic
licenseUserMapItems, err := getItemsFromQuery(dbconfig, queryUserMapsInput)
if err != nil {
Config.Logger.Printf("Error in items for user query: %s", err)
return nil, err
return emptyList, err
}

// Populate list of gen3 license user maps for user
var gen3LicenseUsers []Gen3LicenseUserMap
err = dynamodbattribute.UnmarshalListOfMaps(licenseUserMapItems, &gen3LicenseUsers)
if err != nil {
Config.Logger.Printf("Error in unmarshalling gen3 license user maps for user: %s", err)
return nil, err
return emptyList, err
}
Config.Logger.Printf("Debug: gen3 license user maps for user %v", gen3LicenseUsers)
return &gen3LicenseUsers, nil
return gen3LicenseUsers, nil
}

func getNextLicenseId(activeGen3LicenseUserMaps *[]Gen3LicenseUserMap, maxLicenseIds int) int {
func getNextLicenseId(activeGen3LicenseUserMaps []Gen3LicenseUserMap, maxLicenseIds int) int {
// Determine the next available licenseId [1..6], return 0 if no ids
if len(*activeGen3LicenseUserMaps) == 0 {
if len(activeGen3LicenseUserMaps) == 0 {
return 1
}
var idInUsedIds bool
for i := 1; i <= maxLicenseIds; i++ {
idInUsedIds = false
for _, v := range *activeGen3LicenseUserMaps {
for _, v := range activeGen3LicenseUserMaps {
if i == v.LicenseId {
idInUsedIds = true
break
Expand Down Expand Up @@ -292,21 +312,24 @@ var setGen3LicenseUserInactive = func(dbconfig *DbConfig, itemId string) (Gen3Li
}

// Get the file-path related configurations
func getLicenceFilePathConfigs() []LicenseInfo {
func getLicenceFilePathConfigs() ([]LicenseInfo, error) {
var config LicenseInfo
var filePathConfigs []LicenseInfo

for _, v := range Config.ContainersMap {
if v.License.Enabled {
validateContainerLicenseInfo(v.Name, v.License)
err := validateContainerLicenseInfo(v.Name, v.License)
if err != nil {
return nil, err
}
config.FilePath = v.License.FilePath
config.WorkspaceFlavor = v.License.WorkspaceFlavor
config.G3autoName = v.License.G3autoName
config.G3autoKey = v.License.G3autoKey
filePathConfigs = append(filePathConfigs, config)
}
}
return filePathConfigs
return filePathConfigs, nil
}

func filePathInLicenseConfigs(filePath string, configs []LicenseInfo) bool {
Expand Down
Loading

0 comments on commit bc871cd

Please sign in to comment.