Skip to content

Commit

Permalink
Remove configuration flags, as all values can be set in the config fi…
Browse files Browse the repository at this point in the history
…le **BREAKING** [#200]

Signed-off-by: Huan Wang <huwang@pivotal.io>
Signed-off-by: Kira Boyle <kboyle@pivotal.io>
Signed-off-by: Huan Wang <huwang@pivotal.io>
  • Loading branch information
kcboyle authored and fredwangwang committed Nov 16, 2018
1 parent 7eb10b3 commit 669eca4
Show file tree
Hide file tree
Showing 3 changed files with 232 additions and 174 deletions.
55 changes: 28 additions & 27 deletions acceptance/configure_director_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,52 +202,53 @@ var _ = Describe("configure-director command", func() {

Context("when using command line arguments", func() {
It("configures the BOSH director using the API", func() {
command := exec.Command(pathToMain,
"--target", server.URL,
"--username", "some-username",
"--password", "some-password",
"--skip-ssl-validation",
"configure-director",
"--iaas-configuration",
`{
configFile, err := ioutil.TempFile("", "config.yml")
_, err = configFile.WriteString(`{
"iaas-configuration": {
"project": "some-project",
"default_deployment_tag": "my-vms",
"auth_json": "{\"some-auth-field\": \"some-service-key\",\"some-private_key\": \"some-key\"}"
}`,
"--az-configuration",
`[ {"name": "some-az-1"}, {"name": "some-existing-az"} ]`,
"--networks-configuration",
`{
},
"az-configuration": [ {"name": "some-az-1"}, {"name": "some-existing-az"} ],
"networks-configuration": {
"networks": [{"name": "network-1"}],
"top-level": "the-top"
}`,
"--network-assignment",
`{
},
"network-assignment": {
"network": { "name": "some-network"},
"singleton_availability_zone": {"name": "some-az"}
}`,
"--director-configuration",
`{
},
"director-configuration": {
"ntp_servers_string": "us.example.org, time.something.com",
"resurrector_enabled": false,
"director_hostname": "foo.example.com",
"max_threads": 5
}`,
"--security-configuration",
`{
},
"security-configuration": {
"trusted_certificates": "some-certificate",
"generate_vm_passwords": true
}`,
"--syslog-configuration", `{
},
"syslog-configuration": {
"syslogconfig": "awesome"
}`,
"--resource-configuration", `{
},
"resource-configuration": {
"compilation": {
"instance_type": {
"id": "m4.xlarge"
}
}
}`,
}
}`)
Expect(err).NotTo(HaveOccurred())

command := exec.Command(pathToMain,
"--target", server.URL,
"--username", "some-username",
"--password", "some-password",
"--skip-ssl-validation",
"configure-director",
"--config",
configFile.Name(),
)

session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
Expand Down
183 changes: 86 additions & 97 deletions commands/configure_director.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,38 @@ package commands
import (
"encoding/json"
"fmt"
"sort"

"github.com/pivotal-cf/jhanda"
"github.com/pivotal-cf/om/api"
"gopkg.in/yaml.v2"
"sort"
)

type ConfigureDirector struct {
environFunc func() []string
service configureDirectorService
logger logger
Options struct {
ConfigFile string `short:"c" long:"config" description:"path to yml file containing all config fields (see docs/configure-director/README.md for format)"`
VarsFile []string `long:"vars-file" description:"Load variables from a YAML file"`
VarsEnv []string `long:"vars-env" description:"Load variables from environment variables (e.g.: 'MY' to load MY_var=value)"`
OpsFile []string `long:"ops-file" description:"YAML operations file"`
AZConfiguration string `short:"a" long:"az-configuration" description:"configures network availability zones"`
NetworksConfiguration string `short:"n" long:"networks-configuration" description:"configures networks for the bosh director"`
NetworkAssignment string `short:"na" long:"network-assignment" description:"assigns networks and AZs"`
DirectorConfiguration string `short:"d" long:"director-configuration" description:"properties for director configuration"`
IAASConfiguration string `short:"i" long:"iaas-configuration" description:"iaas specific JSON configuration for the bosh director"`
SecurityConfiguration string `short:"s" long:"security-configuration" decription:"security configuration properties for director"`
SyslogConfiguration string `short:"l" long:"syslog-configuration" decription:"syslog configuration properties for director"`
ResourceConfiguration string `short:"r" long:"resource-configuration" decription:"resource configuration properties for director"`
VMExtensionsConfiguration string `short:"v" long:"vmextensions-configuration" decription:"vm extensions configuration properties"`
// TODO CONFIGFILE is required
ConfigFile string `short:"c" long:"config" description:"path to yml file containing all config fields (see docs/configure-director/README.md for format)"`
VarsFile []string `long:"vars-file" description:"Load variables from a YAML file"`
VarsEnv []string `long:"vars-env" description:"Load variables from environment variables (e.g.: 'MY' to load MY_var=value)"`
OpsFile []string `long:"ops-file" description:"YAML operations file"`
}
}

type directorConfig struct {
NetworkAssignment interface{} `yaml:"network-assignment"`
AZConfiguration interface{} `yaml:"az-configuration"`
NetworksConfiguration interface{} `yaml:"networks-configuration"`
DirectorConfigration interface{} `yaml:"director-configuration"`
IaasConfiguration interface{} `yaml:"iaas-configuration"`
SecurityConfiguration interface{} `yaml:"security-configuration"`
SyslogConfiguration interface{} `yaml:"syslog-configuration"`
ResourceConfiguration interface{} `yaml:"resource-configuration"`
VMExtensions interface{} `yaml:"vmextensions-configuration"`
Field map[string]interface{} `yaml:",inline"`
}

//go:generate counterfeiter -o ./fakes/configure_director_service.go --fake-name ConfigureDirectorService . configureDirectorService
type configureDirectorService interface {
UpdateStagedDirectorAvailabilityZones(api.AvailabilityZoneInput) error
Expand Down Expand Up @@ -60,11 +64,9 @@ func (c ConfigureDirector) Execute(args []string) error {
return fmt.Errorf("could not parse configure-director flags: %s", err)
}

var config directorConfig

if c.Options.ConfigFile != "" {
if c.Options.AZConfiguration != "" || c.Options.NetworksConfiguration != "" || c.Options.NetworkAssignment != "" || c.Options.DirectorConfiguration != "" || c.Options.IAASConfiguration != "" || c.Options.SecurityConfiguration != "" || c.Options.SyslogConfiguration != "" || c.Options.ResourceConfiguration != "" {
return fmt.Errorf("config flag can not be passed with another configuration flags")
}
var config map[string]interface{}
configContents, err := interpolate(interpolateOptions{
templateFile: c.Options.ConfigFile,
varsFiles: c.Options.VarsFile,
Expand All @@ -76,75 +78,37 @@ func (c ConfigureDirector) Execute(args []string) error {
return err
}

err = yaml.Unmarshal(configContents, &config)
err = yaml.UnmarshalStrict(configContents, &config)
if err != nil {
return fmt.Errorf("%s could not be parsed as valid configuration: %s", c.Options.ConfigFile, err)
return fmt.Errorf("could not be parsed as valid configuration: %s: %s", c.Options.ConfigFile, err)
}
}

if config["network-assignment"] != nil {
c.Options.NetworkAssignment, err = getJSONProperties(config["network-assignment"])
if err != nil {
return err
}
}
if config["az-configuration"] != nil {
c.Options.AZConfiguration, err = getJSONProperties(config["az-configuration"])
if err != nil {
return err
}
}
if config["networks-configuration"] != nil {
c.Options.NetworksConfiguration, err = getJSONProperties(config["networks-configuration"])
if err != nil {
return err
}
}
if config["director-configuration"] != nil {
c.Options.DirectorConfiguration, err = getJSONProperties(config["director-configuration"])
if err != nil {
return err
}
}
if config["iaas-configuration"] != nil {
c.Options.IAASConfiguration, err = getJSONProperties(config["iaas-configuration"])
if err != nil {
return err
}
}
if config["security-configuration"] != nil {
c.Options.SecurityConfiguration, err = getJSONProperties(config["security-configuration"])
if err != nil {
return err
}
if config.DirectorConfigration != nil || config.IaasConfiguration != nil || config.SecurityConfiguration != nil || config.SyslogConfiguration != nil {
c.logger.Printf("started configuring director options for bosh tile")

directorConfig, err := getJSONProperties(config.DirectorConfigration)
if err != nil {
return err
}
if config["syslog-configuration"] != nil {
c.Options.SyslogConfiguration, err = getJSONProperties(config["syslog-configuration"])
if err != nil {
return err
}
iaasConfig, err := getJSONProperties(config.IaasConfiguration)
if err != nil {
return err
}
if config["resource-configuration"] != nil {
c.Options.ResourceConfiguration, err = getJSONProperties(config["resource-configuration"])
if err != nil {
return err
}
securityConfig, err := getJSONProperties(config.SecurityConfiguration)
if err != nil {
return err
}
if config["vmextensions-configuration"] != nil {
c.Options.VMExtensionsConfiguration, err = getJSONProperties(config["vmextensions-configuration"])
if err != nil {
return err
}
syslogConfig, err := getJSONProperties(config.SyslogConfiguration)
if err != nil {
return err
}
}

if c.Options.DirectorConfiguration != "" || c.Options.IAASConfiguration != "" || c.Options.SecurityConfiguration != "" || c.Options.SyslogConfiguration != "" {
c.logger.Printf("started configuring director options for bosh tile")

err := c.service.UpdateStagedDirectorProperties(api.DirectorProperties{
DirectorConfiguration: json.RawMessage(c.Options.DirectorConfiguration),
IAASConfiguration: json.RawMessage(c.Options.IAASConfiguration),
SecurityConfiguration: json.RawMessage(c.Options.SecurityConfiguration),
SyslogConfiguration: json.RawMessage(c.Options.SyslogConfiguration),
err = c.service.UpdateStagedDirectorProperties(api.DirectorProperties{
DirectorConfiguration: json.RawMessage(directorConfig),
IAASConfiguration: json.RawMessage(iaasConfig),
SecurityConfiguration: json.RawMessage(securityConfig),
SyslogConfiguration: json.RawMessage(syslogConfig),
})

if err != nil {
Expand All @@ -154,11 +118,16 @@ func (c ConfigureDirector) Execute(args []string) error {
c.logger.Printf("finished configuring director options for bosh tile")
}

if c.Options.AZConfiguration != "" {
if config.AZConfiguration != nil {
c.logger.Printf("started configuring availability zone options for bosh tile")

err := c.service.UpdateStagedDirectorAvailabilityZones(api.AvailabilityZoneInput{
AvailabilityZones: json.RawMessage(c.Options.AZConfiguration),
azs, err := getJSONProperties(config.AZConfiguration)
if err != nil {
return err
}

err = c.service.UpdateStagedDirectorAvailabilityZones(api.AvailabilityZoneInput{
AvailabilityZones: json.RawMessage(azs),
})
if err != nil {
return fmt.Errorf("availability zones configuration could not be applied: %s", err)
Expand All @@ -167,11 +136,16 @@ func (c ConfigureDirector) Execute(args []string) error {
c.logger.Printf("finished configuring availability zone options for bosh tile")
}

if c.Options.NetworksConfiguration != "" {
if config.NetworksConfiguration != nil {
c.logger.Printf("started configuring network options for bosh tile")

err := c.service.UpdateStagedDirectorNetworks(api.NetworkInput{
Networks: json.RawMessage(c.Options.NetworksConfiguration),
networksConfiguration, err := getJSONProperties(config.NetworksConfiguration)
if err != nil {
return err
}

err = c.service.UpdateStagedDirectorNetworks(api.NetworkInput{
Networks: json.RawMessage(networksConfiguration),
})
if err != nil {
return fmt.Errorf("networks configuration could not be applied: %s", err)
Expand All @@ -180,11 +154,15 @@ func (c ConfigureDirector) Execute(args []string) error {
c.logger.Printf("finished configuring network options for bosh tile")
}

if c.Options.NetworkAssignment != "" {
if config.NetworkAssignment != nil {
c.logger.Printf("started configuring network assignment options for bosh tile")

err := c.service.UpdateStagedDirectorNetworkAndAZ(api.NetworkAndAZConfiguration{
NetworkAZ: json.RawMessage(c.Options.NetworkAssignment),
networkAssignment, err := getJSONProperties(config.NetworkAssignment)
if err != nil {
return err
}
err = c.service.UpdateStagedDirectorNetworkAndAZ(api.NetworkAndAZConfiguration{
NetworkAZ: json.RawMessage(networkAssignment),
})
if err != nil {
return fmt.Errorf("network and AZs could not be applied: %s", err)
Expand All @@ -193,7 +171,7 @@ func (c ConfigureDirector) Execute(args []string) error {
c.logger.Printf("finished configuring network assignment options for bosh tile")
}

if c.Options.ResourceConfiguration != "" {
if config.ResourceConfiguration != nil {
c.logger.Printf("started configuring resource options for bosh tile")

findOutput, err := c.service.GetStagedProductByName("p-bosh")
Expand All @@ -202,10 +180,15 @@ func (c ConfigureDirector) Execute(args []string) error {
}
productGUID := findOutput.Product.GUID

resourceConfig, err := getJSONProperties(config.ResourceConfiguration)
if err != nil {
return err
}

var userProvidedConfig map[string]json.RawMessage
err = json.Unmarshal([]byte(c.Options.ResourceConfiguration), &userProvidedConfig)
err = json.Unmarshal([]byte(resourceConfig), &userProvidedConfig)
if err != nil {
return fmt.Errorf("could not decode resource-configuration json: %s", c.Options.ResourceConfiguration)
return fmt.Errorf("could not decode resource-configuration json: %s", config.ResourceConfiguration)
}

jobs, err := c.service.ListStagedProductJobs(productGUID)
Expand Down Expand Up @@ -247,15 +230,15 @@ func (c ConfigureDirector) Execute(args []string) error {
c.logger.Printf("finished configuring resource options for bosh tile")
}

if c.Options.VMExtensionsConfiguration != "" {
if config.VMExtensions != nil {
c.logger.Printf("started configuring vm extensions")

currentExtensions, err := c.getExistingExtensions()
if err != nil {
return err
}

extensionsToDelete, err := c.addNewExtensions(currentExtensions)
extensionsToDelete, err := c.addNewExtensions(currentExtensions, config.VMExtensions)
if err != nil {
return err
}
Expand All @@ -271,11 +254,17 @@ func (c ConfigureDirector) Execute(args []string) error {
return nil
}

func (c ConfigureDirector) addNewExtensions(extensionsToDelete map[string]api.VMExtension) (map[string]api.VMExtension, error) {
func (c ConfigureDirector) addNewExtensions(extensionsToDelete map[string]api.VMExtension, newExtensions interface{}) (map[string]api.VMExtension, error) {
var newVMExtensions []api.VMExtension
err := json.Unmarshal([]byte(c.Options.VMExtensionsConfiguration), &newVMExtensions)

newExtensionBytes, err := getJSONProperties(newExtensions)
if err != nil {
return nil, err
}

err = json.Unmarshal([]byte(newExtensionBytes), &newVMExtensions)
if err != nil {
return nil, fmt.Errorf("could not unmarshall vmextensions-configuration json: %s. Full Error: %s", c.Options.VMExtensionsConfiguration, err)
return nil, fmt.Errorf("could not unmarshall vmextensions-configuration json: %s. Full Error: %s", newExtensions, err)
}

c.logger.Printf("applying vm-extensions configuration for the following:")
Expand Down
Loading

0 comments on commit 669eca4

Please sign in to comment.