From 05c868dcf7da689381bea1f79f000b92c5e0d891 Mon Sep 17 00:00:00 2001 From: Henning Surmeier Date: Tue, 23 Oct 2018 11:46:03 +0200 Subject: [PATCH 1/5] fix semver version range --- spacefile/types_swlist.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacefile/types_swlist.go b/spacefile/types_swlist.go index d0d9acd..6d28942 100644 --- a/spacefile/types_swlist.go +++ b/spacefile/types_swlist.go @@ -2,6 +2,7 @@ package spacefile import ( "fmt" + "strings" "github.com/fatih/color" "github.com/spf13/viper" @@ -54,7 +55,7 @@ func (l SoftwareDefList) Merge(other SoftwareDefList) (SoftwareDefList, error) { // Validate performs (optional) online validation of software version and name func (s SoftwareDef) Validate(offline bool) error { - constraint, errSem := semver.NewConstraint(s.Version) + constraint, errSem := semver.NewConstraint(strings.Replace(s.Version, " ", ", ", 1)) if errSem != nil { return fmt.Errorf("version: %s", errSem.Error()) } From 35c5b048b456722b34b0268746955b96d6c74b74 Mon Sep 17 00:00:00 2001 From: Henning Surmeier Date: Tue, 23 Oct 2018 14:20:47 +0200 Subject: [PATCH 2/5] also unfuck database UserData --- spacefile/hcl.go | 4 ++++ spacefile/types_stage.go | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/spacefile/hcl.go b/spacefile/hcl.go index d18659b..c903183 100644 --- a/spacefile/hcl.go +++ b/spacefile/hcl.go @@ -23,6 +23,10 @@ func unfuckHCL(in interface{}, path string) (interface{}, error) { in = mapped[0] case []map[string]interface{}: + if len(mapped) == 0 { + return nil, nil + } + for key := range mapped { for subKey := range mapped[key] { mapped[0][subKey], err = unfuckHCL(mapped[key][subKey], path+".0."+subKey) diff --git a/spacefile/types_stage.go b/spacefile/types_stage.go index f1dc124..ea11ef8 100644 --- a/spacefile/types_stage.go +++ b/spacefile/types_stage.go @@ -65,6 +65,15 @@ func (d *StageDef) resolveUserData() error { } } + for i := range d.Databases { + d.Databases[i].UserData, err = unfuckHCL(d.Databases[i].UserData, "") + mErr = multierror.Append(mErr, err) + + if d.Databases[i].UserData == nil { + d.Databases[i].UserData = map[string]string{} + } + } + return mErr.ErrorOrNil() } From cff17e0612a245174f0260c88bddb955e90006bc Mon Sep 17 00:00:00 2001 From: Henning Surmeier Date: Thu, 1 Nov 2018 00:04:07 +0100 Subject: [PATCH 3/5] only export r/w cronjobs --- client/spaces/model_cron.go | 1 + spacefile/decl.go | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/spaces/model_cron.go b/client/spaces/model_cron.go index 1a607b9..870f89a 100644 --- a/client/spaces/model_cron.go +++ b/client/spaces/model_cron.go @@ -7,6 +7,7 @@ type Cronjob struct { Schedule string `json:"schedule"` AllowParallel bool `json:"allowParallel"` Job CronjobJob `json:"job"` + ReadOnly bool `json:"readonly"` Timezone string `json:"timezone"` } diff --git a/spacefile/decl.go b/spacefile/decl.go index 839760a..9afb9e2 100644 --- a/spacefile/decl.go +++ b/spacefile/decl.go @@ -74,9 +74,12 @@ func FromSpace(decl *spaces.Space, api client.SpacesClient) (*SpaceDef, error) { UserData: st.UserData, } - cronjobDefs := make(CronjobDefList, len(st.Cronjobs)) + cronjobDefs := make(CronjobDefList, 0) for i := range st.Cronjobs { - cronjobDefs[i] = CronjobFromDeclaration(&st.Cronjobs[i]) + if st.Cronjobs[i].ReadOnly { + continue + } + cronjobDefs = append(cronjobDefs, CronjobFromDeclaration(&st.Cronjobs[i])) } databaseDefs := make(SoftwareDefList, len(st.Databases)) From fdc17b5f35af5699002d75f2861d3fdd60f013ca Mon Sep 17 00:00:00 2001 From: Henning Surmeier Date: Fri, 2 Nov 2018 14:55:34 +0100 Subject: [PATCH 4/5] omit cronjob from export --- client/spaces/model_cron.go | 2 +- client/spaces/protection.go | 6 +++--- spacefile/decl.go | 9 --------- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/client/spaces/model_cron.go b/client/spaces/model_cron.go index 870f89a..db858be 100644 --- a/client/spaces/model_cron.go +++ b/client/spaces/model_cron.go @@ -7,7 +7,7 @@ type Cronjob struct { Schedule string `json:"schedule"` AllowParallel bool `json:"allowParallel"` Job CronjobJob `json:"job"` - ReadOnly bool `json:"readonly"` + ReadOnly bool `json:"readonly"` Timezone string `json:"timezone"` } diff --git a/client/spaces/protection.go b/client/spaces/protection.go index af8ab57..d8b9d0a 100644 --- a/client/spaces/protection.go +++ b/client/spaces/protection.go @@ -2,9 +2,10 @@ package spaces import ( "fmt" - "github.com/mittwald/spacectl/client/lowlevel" "net/url" + "github.com/mittwald/spacectl/client/lowlevel" + "github.com/mittwald/spacectl/client/errors" ) @@ -40,9 +41,8 @@ func (c *spacesClient) CreateStageProtection(spaceID, stage string, inputProtect // DeleteStageProtection disables the Stage Protection for the given stage func (c *spacesClient) DeleteStageProtection(spaceID, stage string) error { - var target Empty deletePath := fmt.Sprintf("/spaces/%s/stages/%s/protection", url.PathEscape(spaceID), url.PathEscape(stage)) - err := c.client.Delete(deletePath, &target) + err := c.client.Delete(deletePath, nil) if err != nil { return errors.ErrNested{Inner: err, Msg: fmt.Sprintf("could not delete protection for space: %s, stage: %s", spaceID, stage)} } diff --git a/spacefile/decl.go b/spacefile/decl.go index 9afb9e2..9c8da3d 100644 --- a/spacefile/decl.go +++ b/spacefile/decl.go @@ -74,14 +74,6 @@ func FromSpace(decl *spaces.Space, api client.SpacesClient) (*SpaceDef, error) { UserData: st.UserData, } - cronjobDefs := make(CronjobDefList, 0) - for i := range st.Cronjobs { - if st.Cronjobs[i].ReadOnly { - continue - } - cronjobDefs = append(cronjobDefs, CronjobFromDeclaration(&st.Cronjobs[i])) - } - databaseDefs := make(SoftwareDefList, len(st.Databases)) for i := range st.Databases { databaseDefs[i] = SoftwareDef{ @@ -99,7 +91,6 @@ func FromSpace(decl *spaces.Space, api client.SpacesClient) (*SpaceDef, error) { stageDef := StageDef{ Name: st.Name, Applications: appDefs, - Cronjobs: cronjobDefs, Databases: databaseDefs, Protection: protection.ProtectionType, } From d6922c7094d3bf1d6eccb6f473beab41be1ba47d Mon Sep 17 00:00:00 2001 From: Henning Surmeier Date: Fri, 2 Nov 2018 17:42:56 +0100 Subject: [PATCH 5/5] fix semver sanitizer --- spacefile/types_swlist.go | 11 ++++++++++- spacefile/types_swlist_test.go | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/spacefile/types_swlist.go b/spacefile/types_swlist.go index 6d28942..ee57ba7 100644 --- a/spacefile/types_swlist.go +++ b/spacefile/types_swlist.go @@ -2,6 +2,7 @@ package spacefile import ( "fmt" + "regexp" "strings" "github.com/fatih/color" @@ -53,9 +54,17 @@ func (l SoftwareDefList) Merge(other SoftwareDefList) (SoftwareDefList, error) { return merged, nil } +// sanitizes semver declarations like this: >=5.7.0 <6.0.0 +// to go supported semver, which requires a comma between versions +func sanitizeSemver(ver string) string { + sepVersion := regexp.MustCompile(`(\s+)([0-9])`) // make sure no other whitespace exists + ver = sepVersion.ReplaceAllString(ver, "$2") + return strings.Replace(ver, " ", ", ", 1) // replace whitespace +} + // Validate performs (optional) online validation of software version and name func (s SoftwareDef) Validate(offline bool) error { - constraint, errSem := semver.NewConstraint(strings.Replace(s.Version, " ", ", ", 1)) + constraint, errSem := semver.NewConstraint(sanitizeSemver(s.Version)) if errSem != nil { return fmt.Errorf("version: %s", errSem.Error()) } diff --git a/spacefile/types_swlist_test.go b/spacefile/types_swlist_test.go index b54faf1..c99f86f 100644 --- a/spacefile/types_swlist_test.go +++ b/spacefile/types_swlist_test.go @@ -1,10 +1,16 @@ package spacefile import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) +func TestSemverSanitize(t *testing.T) { + ver := "<= 1.2.3 >= 2.4.5" + require.Equal(t, sanitizeSemver(ver), "<=1.2.3, >=2.4.5") +} + func TestNewSoftwareIsAdded(t *testing.T) { base := SoftwareDefList{SoftwareDef{Identifier: "typo3", Version: "1.2.3"}} overlay := SoftwareDefList{SoftwareDef{Identifier: "magento", Version: "3.2.1"}}