Skip to content
This repository has been archived by the owner on Jan 9, 2023. It is now read-only.

Commit

Permalink
Merge pull request #471 from JoshVanL/281-validate-subnets
Browse files Browse the repository at this point in the history
Validate hub cluster contains all zones of multi-cluster
  • Loading branch information
jetstack-bot committed Sep 10, 2018
2 parents e74f08c + 0dd63ae commit 796d95d
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 3 deletions.
30 changes: 30 additions & 0 deletions pkg/tarmak/cluster/cluster.go
Expand Up @@ -299,6 +299,10 @@ func (c *Cluster) validateInstancePools() error {
return err
}

if err := c.validateSubnets(); err != nil {
return err
}

return nil
}

Expand Down Expand Up @@ -838,3 +842,29 @@ func (c *Cluster) PublicAPIHostname() string {
c.Environment().Provider().PublicZone(),
)
}

func (c *Cluster) validateSubnets() error {
var result *multierror.Error

if c.Type() == clusterv1alpha1.ClusterTypeClusterMulti && c.Environment().Hub() != nil {
hSubnets := c.Environment().Hub().Subnets()

for _, cNet := range c.Subnets() {
found := false

for _, hNet := range hSubnets {
if cNet.Zone == hNet.Zone {
found = true
break
}
}

if !found {
err := fmt.Errorf("hub cluster does not include zone '%s'", cNet.Zone)
result = multierror.Append(result, err)
}
}
}

return result.ErrorOrNil()
}
103 changes: 100 additions & 3 deletions pkg/tarmak/cluster/cluster_test.go
Expand Up @@ -35,12 +35,11 @@ func newFakeCluster(t *testing.T, cluster *clusterv1alpha1.Cluster) *fakeCluster
conf: cluster,
},
}

c.fakeEnvironment = mocks.NewMockEnvironment(c.ctrl)
c.fakeProvider = mocks.NewMockProvider(c.ctrl)
c.fakeTarmak = mocks.NewMockTarmak(c.ctrl)
c.fakeConfig = mocks.NewMockConfig(c.ctrl)
c.Cluster.environment = c.fakeEnvironment
c.fakeEnvironment = mocks.NewMockEnvironment(c.ctrl)
c.environment = c.fakeEnvironment

// setup custom logger
logger := logrus.New()
Expand All @@ -65,13 +64,26 @@ func newFakeCluster(t *testing.T, cluster *clusterv1alpha1.Cluster) *fakeCluster
return c
}

func newFakeHub(t *testing.T) *fakeCluster {
return &fakeCluster{
ctrl: gomock.NewController(t),
Cluster: &Cluster{
conf: &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeHub,
},
},
}
}

func TestCluster_NewMinimalClusterMulti(t *testing.T) {
clusterConfig := config.NewClusterMulti("multi", "cluster")
config.ApplyDefaults(clusterConfig)
clusterConfig.Location = "my-region"
c := newFakeCluster(t, nil)
defer c.Finish()

c.fakeEnvironment.EXPECT().Hub().AnyTimes().Return(newFakeHub(t))

// fake two clusters
c.fakeEnvironment.EXPECT().Name().Return("multi").AnyTimes()
c.fakeConfig.EXPECT().Clusters("multi").Return([]*clusterv1alpha1.Cluster{
Expand Down Expand Up @@ -225,6 +237,8 @@ func TestCluster_ValidateClusterInstancePoolTypesHub(t *testing.T) {
c := newFakeCluster(t, nil)
defer c.Finish()

c.fakeEnvironment.EXPECT().Hub().AnyTimes().Return(newFakeHub(t))

var err error
c.Cluster, err = NewFromConfig(c.fakeEnvironment, clusterConfig)
if err != nil {
Expand Down Expand Up @@ -261,6 +275,8 @@ func TestCluster_ValidateClusterInstancePoolsMulti(t *testing.T) {
c := newFakeCluster(t, nil)
defer c.Finish()

c.fakeEnvironment.EXPECT().Hub().AnyTimes().Return(newFakeHub(t))

var err error
c.Cluster, err = NewFromConfig(c.fakeEnvironment, clusterConfig)
if err != nil {
Expand Down Expand Up @@ -408,6 +424,87 @@ func tryInstancePoolCount(c *fakeCluster, singleTypes, multiTypes []string, t *t
c.conf = baseConfig.DeepCopy()
}

func TestClusterValidateSubnetsIgnore(t *testing.T) {
clusterConfig := config.NewClusterMulti("multi", "cluster")
config.ApplyDefaults(clusterConfig)
clusterConfig.Location = "my-region"
c := newFakeCluster(t, &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeClusterSingle,
})
defer c.Finish()

if err := c.validateSubnets(); err != nil {
t.Errorf("unexpected error: %v", err)
}

c = newFakeCluster(t, &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeHub,
})
defer c.Finish()

if err := c.validateSubnets(); err != nil {
t.Errorf("unexpected error: %v", err)
}
}

func TestClusterValidateSubnetsMulti(t *testing.T) {
clusterConfig := config.NewClusterMulti("multi", "cluster")
config.ApplyDefaults(clusterConfig)
clusterConfig.Location = "my-region"
c := newFakeCluster(t, &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeClusterMulti,
})
defer c.Finish()

superZones := []string{
"zone-1",
"zone-2",
"zone-3",
}

subZones := []string{
"zone-1",
"zone-2",
}

hub := newFakeCluster(t, &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeHub,
InstancePools: instancePoolsWithZones(superZones),
})
c.fakeEnvironment.EXPECT().Hub().Times(4).Return(hub)
c.conf.InstancePools = instancePoolsWithZones(subZones)
if err := c.validateSubnets(); err != nil {
t.Errorf("unexpected error: %v", err)
}

c.conf.InstancePools = instancePoolsWithZones(superZones)
if err := c.validateSubnets(); err != nil {
t.Errorf("unexpected error: %v", err)
}

hub = newFakeCluster(t, &clusterv1alpha1.Cluster{
Type: clusterv1alpha1.ClusterTypeHub,
InstancePools: instancePoolsWithZones(subZones),
})
c.fakeEnvironment.EXPECT().Hub().Times(2).Return(hub)
if err := c.validateSubnets(); err == nil {
t.Errorf("expected error due to hub not including zone, got=none")
}

}

func instancePoolsWithZones(zones []string) []clusterv1alpha1.InstancePool {
pool := clusterv1alpha1.InstancePool{}

for _, z := range zones {
pool.Subnets = append(pool.Subnets, &clusterv1alpha1.Subnet{
Zone: z,
})
}

return []clusterv1alpha1.InstancePool{pool}
}

/*
func testDefaultClusterConfig() *config.Cluster {
return &config.Cluster{
Expand Down

0 comments on commit 796d95d

Please sign in to comment.