package integration_test import ( "fmt" "strconv" "strings" "github.com/udacity/graphb" "edge-infra.dev/pkg/edge/api/graph/model" "edge-infra.dev/pkg/edge/constants/api/fleet" "edge-infra.dev/pkg/lib/runtime/version" "edge-infra.dev/test/framework/integration" ) const clusterEdgeID = "79d6194b-0ace-44ff-93e0-ab91945dcd03" func (s *Suite) TestGetAvailableArtifactVersionsForStore() { integration.SkipIf(s.Framework) query := availableFleetVersionsQuery(fleet.Store) var versionsResponse struct{ AvailableFleetVersions []string } ResolverClient.MustPost(query, &versionsResponse) // Currently asserting support window of 3 minor versions s.Len(versionsResponse.AvailableFleetVersions, 3) // The current build's version should always be the latest, and appears first in the sorted response currentBuild := version.New().SemVer s.Equal(currentBuild, versionsResponse.AvailableFleetVersions[0]) // N-1 version is supported versionParts := strings.Split(versionsResponse.AvailableFleetVersions[1], ".") s.Len(versionParts, 3) versionMinor, err := strconv.Atoi(versionParts[1]) s.Require().NoError(err) s.Contains(versionsResponse.AvailableFleetVersions[1], fmt.Sprintf("%d", versionMinor)) // N-2 version is supported versionParts = strings.Split(versionsResponse.AvailableFleetVersions[2], ".") s.Len(versionParts, 3) versionMinor, err = strconv.Atoi(versionParts[1]) s.Require().NoError(err) s.Contains(versionsResponse.AvailableFleetVersions[2], fmt.Sprintf("%d", versionMinor)) } func (s *Suite) TestGetAvailableArtifactVersionsForNotStore() { integration.SkipIf(s.Framework) query := availableFleetVersionsQuery(fleet.Banner) var versionsResponse struct{ AvailableFleetVersions []string } ResolverClient.MustPost(query, &versionsResponse) // Available artifacts are based on fleet type, so anything other than store should have 0 options s.Len(versionsResponse.AvailableFleetVersions, 0) } func (s *Suite) TestAutoUpdateTrigger() { integration.SkipIf(s.Framework) // initially auto-update disabled var initialConfig struct { ClusterConfig model.ClusterConfig Cluster model.Cluster } ResolverClient.MustPost(clusterAutoUpdateAndVersionQuery(clusterEdgeID), &initialConfig) s.Equal(false, initialConfig.ClusterConfig.AutoUpdateEnabled) s.Equal("0.0.0-test", initialConfig.Cluster.FleetVersion) // enable auto-update should trigger changes to cluster's fleetVersion var updateResponse struct{ UpdateClusterConfig model.ClusterConfig } ResolverClient.MustPost(updateClusterConfigAutoUpdateEnabled(clusterEdgeID, true), &updateResponse) s.Equal(true, updateResponse.UpdateClusterConfig.AutoUpdateEnabled) var updatedConfig struct { ClusterConfig model.ClusterConfig Cluster model.Cluster } ResolverClient.MustPost(clusterAutoUpdateAndVersionQuery(clusterEdgeID), &updatedConfig) s.Equal(true, updatedConfig.ClusterConfig.AutoUpdateEnabled) s.Equal(version.New().SemVer, updatedConfig.Cluster.FleetVersion) } func availableFleetVersionsQuery(fleet string) string { return MustParse(graphb.Query{ Type: graphb.TypeQuery, Fields: []*graphb.Field{ { Name: "availableFleetVersions", Arguments: []graphb.Argument{ graphb.ArgumentString("fleet", fleet), }, }, }, }) } func updateClusterConfigAutoUpdateEnabled(clusterEdgeID string, autoUpdateEnabled bool) string { config := graphb.ArgumentCustomTypeSliceElem( graphb.ArgumentBool("autoUpdateEnabled", autoUpdateEnabled), ) args := []graphb.Argument{ graphb.ArgumentString("clusterEdgeId", clusterEdgeID), graphb.ArgumentCustomType("updateClusterConfig", config...), } return MustParse(graphb.Query{ Type: graphb.TypeMutation, Fields: []*graphb.Field{ { Name: "updateClusterConfig", Arguments: args, Fields: []*graphb.Field{ graphb.NewField("autoUpdateEnabled"), }, }, }, }) } func clusterAutoUpdateAndVersionQuery(clusterEdgeID string) string { args := []graphb.Argument{ graphb.ArgumentString("clusterEdgeId", clusterEdgeID), } return MustParse(graphb.Query{ Type: graphb.TypeQuery, Fields: []*graphb.Field{ { Name: "cluster", Arguments: args, Fields: []*graphb.Field{ graphb.NewField("fleetVersion"), }, }, { Name: "clusterConfig", Arguments: args, Fields: []*graphb.Field{ graphb.NewField("autoUpdateEnabled"), }, }, }, }) }