Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions pkg/cmd/render/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,15 @@ type TemplateData struct {
}

func discoverRestrictedCIDRs(clusterConfigFileData []byte, renderConfig *TemplateData) error {
if err := discoverRestrictedCIDRsFromNetwork(clusterConfigFileData, renderConfig); err != nil {
if err = discoverRestrictedCIDRsFromClusterAPI(clusterConfigFileData, renderConfig); err != nil {
return err
}
}
return nil
}

func discoverRestrictedCIDRsFromClusterAPI(clusterConfigFileData []byte, renderConfig *TemplateData) error {
configJson, err := yaml.YAMLToJSON(clusterConfigFileData)
if err != nil {
return err
Expand Down Expand Up @@ -138,6 +147,46 @@ func discoverRestrictedCIDRs(clusterConfigFileData []byte, renderConfig *Templat
return nil
}

func discoverRestrictedCIDRsFromNetwork(clusterConfigFileData []byte, renderConfig *TemplateData) error {
configJson, err := yaml.YAMLToJSON(clusterConfigFileData)
if err != nil {
return err
}
clusterConfigObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, configJson)
if err != nil {
return err
}
clusterConfig, ok := clusterConfigObj.(*unstructured.Unstructured)
if !ok {
return fmt.Errorf("unexpected object in %t", clusterConfigObj)
}
clusterCIDR, found, err := unstructured.NestedSlice(
clusterConfig.Object, "spec", "clusterNetwork")
if found && err == nil {
for key := range clusterCIDR {
slice, ok := clusterCIDR[key].(map[string]interface{})
if !ok {
return fmt.Errorf("unexpected object in %t", clusterCIDR[key])
}
if CIDR, found, err := unstructured.NestedString(slice, "cidr"); found && err == nil {
renderConfig.ClusterCIDR = append(renderConfig.ClusterCIDR, CIDR)
}
}
}
if err != nil {
return err
}
serviceCIDR, found, err := unstructured.NestedStringSlice(
clusterConfig.Object, "spec", "serviceNetwork")
if found && err == nil {
renderConfig.ServiceClusterIPRange = serviceCIDR
}
if err != nil {
return err
}
return nil
}

// Run contains the logic of the render command.
func (r *renderOpts) Run() error {
renderConfig := TemplateData{}
Expand Down
93 changes: 93 additions & 0 deletions pkg/cmd/render/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,53 @@ import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"strings"
"testing"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

var (
expectedClusterCIDR = []string{"10.128.0.0/14"}
expectedServiceCIDR = []string{"172.30.0.0/16"}
clusterAPIConfig = `
apiVersion: machine.openshift.io/v1beta1
kind: Cluster
metadata:
creationTimestamp: null
name: cluster
namespace: openshift-machine-api
spec:
clusterNetwork:
pods:
cidrBlocks:
- 10.128.0.0/14
serviceDomain: ""
services:
cidrBlocks:
- 172.30.0.0/16
providerSpec: {}
status: {}
`
networkConfig = `
apiVersion: config.openshift.io/v1
kind: Network
metadata:
creationTimestamp: null
name: cluster
spec:
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
networkType: OpenShiftSDN
serviceNetwork:
- 172.30.0.0/16
status: {}
`
)

func runRender(args ...string) (*cobra.Command, error) {
errOut := &bytes.Buffer{}
c := NewRenderCommand(errOut)
Expand Down Expand Up @@ -113,3 +153,56 @@ func TestRenderCommand(t *testing.T) {
}
}
}

func TestDiscoverRestrictedCIDRsFromNetwork(t *testing.T) {
renderConfig := TemplateData{}
if err := discoverRestrictedCIDRsFromNetwork([]byte(networkConfig), &renderConfig); err != nil {
t.Errorf("failed discoverCIDRs: %v", err)
}
if !reflect.DeepEqual(renderConfig.ClusterCIDR, expectedClusterCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ClusterCIDR, expectedClusterCIDR)
}
if !reflect.DeepEqual(renderConfig.ServiceClusterIPRange, expectedServiceCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ServiceClusterIPRange, expectedServiceCIDR)
}
}

func TestDiscoverRestrictedCIDRsFromClusterAPI(t *testing.T) {
renderConfig := TemplateData{}
if err := discoverRestrictedCIDRsFromClusterAPI([]byte(clusterAPIConfig), &renderConfig); err != nil {
t.Errorf("failed discoverCIDRs: %v", err)
}
if !reflect.DeepEqual(renderConfig.ClusterCIDR, expectedClusterCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ClusterCIDR, expectedClusterCIDR)
}
if !reflect.DeepEqual(renderConfig.ServiceClusterIPRange, expectedServiceCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ServiceClusterIPRange, expectedServiceCIDR)
}
}

func TestDiscoverRestrictedCIDRs(t *testing.T) {
testCase := []struct {
config []byte
}{
{
config: []byte(networkConfig),
},
{
config: []byte(clusterAPIConfig),
},
}

for _, tc := range testCase {
renderConfig := TemplateData{}
if err := discoverRestrictedCIDRs(tc.config, &renderConfig); err != nil {
t.Errorf("failed to discoverCIDRs: %v", err)
}

if !reflect.DeepEqual(renderConfig.ClusterCIDR, expectedClusterCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ClusterCIDR, expectedClusterCIDR)
}
if !reflect.DeepEqual(renderConfig.ServiceClusterIPRange, expectedServiceCIDR) {
t.Errorf("Got: %v, expected: %v", renderConfig.ServiceClusterIPRange, expectedServiceCIDR)
}
}
}