Skip to content

Commit

Permalink
Remove field requirements to work with GitHub (#41)
Browse files Browse the repository at this point in the history
* Remove field requirements to work with GitHub

* Fix lint errors
  • Loading branch information
phillebaba authored Oct 11, 2021
1 parent 15b5c10 commit e3fdce6
Show file tree
Hide file tree
Showing 4 changed files with 176 additions and 173 deletions.
65 changes: 52 additions & 13 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package config

import (
"encoding/json"
"strings"

"github.com/go-playground/validator/v10"
"github.com/spf13/afero"
)

const (
defaultScheme = "https"
)

type ProviderType string
Expand All @@ -16,25 +24,15 @@ type Configuration struct {
}

type Organization struct {
Provider ProviderType `json:"provider" validate:"required"`
Provider ProviderType `json:"provider" validate:"required,oneof='azuredevops' 'github'"`
AzureDevOps AzureDevOps `json:"azuredevops"`
GitHub GitHub `json:"github"`
Host string `json:"host,omitempty" validate:"required"`
Host string `json:"host,omitempty" validate:"required,hostname"`
Scheme string `json:"scheme,omitempty" validate:"required"`
Name string `json:"name" validate:"required"`
Repositories []*Repository `json:"repositories" validate:"required,dive"`
}

type AzureDevOps struct {
Pat string `json:"pat"`
}

type GitHub struct {
AppID int64 `json:"appID"`
InstallationID int64 `json:"installationID"`
PrivateKey string `json:"privateKey"`
}

func (o *Organization) GetSecretName(r *Repository) string {
if r.SecretNameOverride != "" {
return r.SecretNameOverride
Expand All @@ -49,9 +47,50 @@ func (o *Organization) GetSecretName(r *Repository) string {
return strings.Join(comps, "-")
}

type AzureDevOps struct {
Pat string `json:"pat"`
}

type GitHub struct {
AppID int64 `json:"appID"`
InstallationID int64 `json:"installationID"`
PrivateKey string `json:"privateKey"`
}

type Repository struct {
Project string `json:"project" validate:"required"`
Project string `json:"project"`
Name string `json:"name" validate:"required"`
Namespaces []string `json:"namespaces" validate:"required"`
SecretNameOverride string `json:"secretNameOverride,omitempty"`
}

func setConfigurationDefaults(cfg *Configuration) *Configuration {
for i, o := range cfg.Organizations {
if o.Scheme == "" {
cfg.Organizations[i].Scheme = defaultScheme
}
}
return cfg
}

// LoadConfiguration parses and validates the configuration file at a given path.
func LoadConfiguration(fs afero.Fs, path string) (*Configuration, error) {
b, err := afero.ReadFile(fs, path)
if err != nil {
return nil, err
}

cfg := &Configuration{}
err = json.Unmarshal(b, &cfg)
if err != nil {
return nil, err
}
cfg = setConfigurationDefaults(cfg)

validate := validator.New()
err = validate.Struct(cfg)
if err != nil {
return nil, err
}
return cfg, nil
}
124 changes: 124 additions & 0 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package config

import (
"testing"

"github.com/spf13/afero"
"github.com/stretchr/testify/require"
)

func fsWithContent(content string) (afero.Fs, string, error) {
path := "config.json"
fs := afero.NewMemMapFs()
file, err := fs.Create(path)
if err != nil {
return nil, "", err
}
defer file.Close()
_, err = file.WriteString(content)
if err != nil {
return nil, "", err
}
return fs, path, nil
}

const invalidJson = `
{
"host": "dev.azure.com",
}}
}
`

func TestInvalidJson(t *testing.T) {
fs, path, err := fsWithContent(invalidJson)
require.NoError(t, err)
_, err = LoadConfiguration(fs, path)
require.Error(t, err)
}

const validAzureDevOps = `
{
"organizations": [
{
"provider": "azuredevops",
"azuredevops": {
"pat": "foobar"
},
"host": "dev.azure.com",
"name": "xenitab",
"repositories": [
{
"project": "Lab",
"name": "gitops-deployment",
"namespaces": ["foo"]
}
]
}
]
}
`

// nolint:dupl // false positive
func TestValidAzureDevOps(t *testing.T) {
fs, path, err := fsWithContent(validAzureDevOps)
require.NoError(t, err)
cfg, err := LoadConfiguration(fs, path)
require.NoError(t, err)

require.NotEmpty(t, cfg.Organizations)
require.Equal(t, "azuredevops", string(cfg.Organizations[0].Provider))
require.Equal(t, "foobar", cfg.Organizations[0].AzureDevOps.Pat)
require.Equal(t, int64(0), cfg.Organizations[0].GitHub.AppID)
require.Equal(t, int64(0), cfg.Organizations[0].GitHub.InstallationID)
require.Equal(t, "", cfg.Organizations[0].GitHub.PrivateKey)
require.Equal(t, "dev.azure.com", cfg.Organizations[0].Host)
require.Equal(t, "https", cfg.Organizations[0].Scheme)
require.Equal(t, "xenitab", cfg.Organizations[0].Name)
require.NotEmpty(t, cfg.Organizations[0].Repositories)
require.Equal(t, "gitops-deployment", cfg.Organizations[0].Repositories[0].Name)
require.Equal(t, "Lab", cfg.Organizations[0].Repositories[0].Project)
}

const validGitHub = `
{
"organizations": [
{
"provider": "github",
"github": {
"appID": 123,
"installationID": 123,
"privateKey": "foobar"
},
"host": "github.com",
"name": "xenitab",
"repositories": [
{
"name": "gitops-deployment",
"namespaces": ["foo"]
}
]
}
]
}
`

// nolint:dupl // false positive
func TestValidGitHub(t *testing.T) {
fs, path, err := fsWithContent(validGitHub)
require.NoError(t, err)
cfg, err := LoadConfiguration(fs, path)
require.NoError(t, err)

require.NotEmpty(t, cfg.Organizations)
require.Equal(t, "github", string(cfg.Organizations[0].Provider))
require.Equal(t, "", cfg.Organizations[0].AzureDevOps.Pat)
require.Equal(t, int64(123), cfg.Organizations[0].GitHub.AppID)
require.Equal(t, int64(123), cfg.Organizations[0].GitHub.InstallationID)
require.Equal(t, "foobar", cfg.Organizations[0].GitHub.PrivateKey)
require.Equal(t, "github.com", cfg.Organizations[0].Host)
require.Equal(t, "https", cfg.Organizations[0].Scheme)
require.Equal(t, "xenitab", cfg.Organizations[0].Name)
require.NotEmpty(t, cfg.Organizations[0].Repositories)
require.Equal(t, "gitops-deployment", cfg.Organizations[0].Repositories[0].Name)
require.Equal(t, "", cfg.Organizations[0].Repositories[0].Project)
}
41 changes: 0 additions & 41 deletions pkg/config/load.go

This file was deleted.

119 changes: 0 additions & 119 deletions pkg/config/load_test.go

This file was deleted.

0 comments on commit e3fdce6

Please sign in to comment.