Skip to content

Commit

Permalink
feat: WIP - add maas plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
arturshadnik committed Aug 9, 2024
1 parent 2a3fe4d commit 3b2e499
Show file tree
Hide file tree
Showing 14 changed files with 1,139 additions and 1 deletion.
12 changes: 12 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ require (
github.com/validator-labs/validator v0.1.2
github.com/validator-labs/validator-plugin-aws v0.1.3
github.com/validator-labs/validator-plugin-azure v0.0.16-0.20240809035651-b4687e5f1cec
github.com/validator-labs/validator-plugin-maas v0.0.8-0.20240807214621-951e09472a70
github.com/validator-labs/validator-plugin-network v0.0.22
github.com/validator-labs/validator-plugin-oci v0.1.0
github.com/validator-labs/validator-plugin-vsphere v0.0.30-0.20240808221109-a93cb7014075
Expand Down Expand Up @@ -98,6 +99,7 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/canonical/gomaasclient v0.6.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
Expand All @@ -108,6 +110,7 @@ require (
github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect
github.com/cyphar/filepath-securejoin v0.2.5 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect
github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
Expand Down Expand Up @@ -163,6 +166,13 @@ require (
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/juju/collections v1.0.4 // indirect
github.com/juju/errors v1.0.0 // indirect
github.com/juju/gomaasapi/v2 v2.3.0 // indirect
github.com/juju/loggo v1.0.0 // indirect
github.com/juju/mgo/v2 v2.0.2 // indirect
github.com/juju/schema v1.0.1 // indirect
github.com/juju/version v0.0.0-20210303051006-2015802527a8 // indirect
github.com/klauspost/compress v1.17.8 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
Expand Down Expand Up @@ -242,6 +252,7 @@ require (
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.30.1 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
Expand All @@ -254,3 +265,4 @@ require (
)

// replace github.com/spectrocloud-labs/prompts-tui => ../../spectrocloud-labs/prompts-tui
replace github.com/canonical/gomaasclient v0.6.0 => github.com/arturshadnik/gomaasclient v0.0.0-20240731231205-8239cfb13409
131 changes: 131 additions & 0 deletions go.sum

Large diffs are not rendered by default.

37 changes: 37 additions & 0 deletions hack/validator.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -825,3 +825,40 @@ azurePlugin:
auth:
implicit: false
secretName: azure-creds
maasPlugin:
enabled: true
helmRelease:
chart:
name: validator-plugin-maas
repository: validator-plugin-maas
version: v${MAAS_VERSION}
values: ""
validator:
internalDNSRules:
- maasDomain: example.com
dnsResources:
- fqdn: foo.example.com
dnsRecords:
- type: A
ip: 0.0.0.0
ttl: 10
upstreamDNSRules:
- name: upstream dns
numDNSServers: 1
imageRules:
- name: Image Rule
images:
- name: example
architecture: amd64/ga-20.04
resourceAvailabilityRules:
- name: AZ1
az: az1
resources:
- numMachines: 1
numCPU: 16
ram: 16
disk: 100
host: "http://example.com/MAAS"
auth:
secretName: maas-creds
tokenKey: MAAS_API_KEY
1 change: 1 addition & 0 deletions hack/versions.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var ValidatorChartVersions = map[string]string{
Validator: "v${VALIDATOR_VERSION}",
ValidatorPluginAws: "v${AWS_VERSION}",
ValidatorPluginAzure: "v${AZURE_VERSION}",
ValidatorPluginMaas: "v${MAAS_VERSION}",
ValidatorPluginNetwork: "v${NETWORK_VERSION}",
ValidatorPluginOci: "v${OCI_VERSION}",
ValidatorPluginVsphere: "v${VSPHERE_VERSION}",
Expand Down
48 changes: 48 additions & 0 deletions pkg/cmd/validator/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import (
awsval "github.com/validator-labs/validator-plugin-aws/pkg/validate"
azureapi "github.com/validator-labs/validator-plugin-azure/api/v1alpha1"
azureval "github.com/validator-labs/validator-plugin-azure/pkg/validate"
maasapi "github.com/validator-labs/validator-plugin-maas/api/v1alpha1"
maasval "github.com/validator-labs/validator-plugin-maas/pkg/validate"
netapi "github.com/validator-labs/validator-plugin-network/api/v1alpha1"
netval "github.com/validator-labs/validator-plugin-network/pkg/validate"
ociapi "github.com/validator-labs/validator-plugin-oci/api/v1alpha1"
Expand Down Expand Up @@ -548,6 +550,26 @@ func executePlugins(c *cfg.Config, vc *components.ValidatorConfig) error {
results = append(results, vr)
}

if vc.MaasPlugin.Enabled {
v := &maasapi.MaasValidator{
ObjectMeta: metav1.ObjectMeta{
Name: "azure-validator",
Namespace: "N/A",
},
Spec: *vc.MaasPlugin.Validator,
}
vr := vres.Build(v)
// TODO: set TypeMeta in vres.Build
vr.TypeMeta = metav1.TypeMeta{
APIVersion: "validation.spectrocloud.labs/v1alpha1",
Kind: "MaasValidator",
}
vrr := maasval.Validate(*vc.MaasPlugin.Validator, vc.MaasPlugin.Validator.Host, vc.MaasPlugin.MaasAPIToken, l)
if err := vres.Finalize(vr, vrr, l); err != nil {
return err
}
results = append(results, vr)
}
if vc.NetworkPlugin.Enabled {
v := &netapi.NetworkValidator{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -764,6 +786,22 @@ func applyValidator(c *cfg.Config, vc *components.ValidatorConfig) error {
pluginCount++
}

if vc.MaasPlugin.Enabled {
args := map[string]interface{}{
"Config": vc.MaasPlugin,
"ImageRegistry": vc.ImageRegistry,
}
values, err := embed.EFS.RenderTemplateBytes(args, cfg.Validator, "validator-plugin-maas-values.tmpl")
if err != nil {
return errors.Wrap(err, "failed to render validator plugin maas values.yaml")
}
validatorSpec.Plugins = append(validatorSpec.Plugins, vapi.HelmRelease{
Chart: vc.MaasPlugin.Release.Chart,
Values: string(values),
})
pluginCount++
}

if vc.NetworkPlugin.Enabled {
args := map[string]interface{}{
"Config": vc.NetworkPlugin,
Expand Down Expand Up @@ -824,6 +862,7 @@ func applyValidator(c *cfg.Config, vc *components.ValidatorConfig) error {
"SinkConfig": vc.SinkConfig,
"AWSPlugin": vc.AWSPlugin,
"AzurePlugin": vc.AzurePlugin,
"MAASPlugin": vc.MaasPlugin,
"NetworkPlugin": vc.NetworkPlugin,
"OCIPlugin": vc.OCIPlugin,
"VspherePlugin": vc.VspherePlugin,
Expand Down Expand Up @@ -1045,6 +1084,15 @@ func applyPlugins(c *cfg.Config, vc *components.ValidatorConfig) error {
}
}

if vc.MaasPlugin.Enabled {
log.InfoCLI("\n==== Applying MAAS plugin validator(s) ====")
if err := createValidator(
vc.Kubeconfig, c.RunLoc, cfg.ValidatorPluginMaas, cfg.ValidatorPluginMaasTemplate, *vc.MaasPlugin.Validator,
); err != nil {
return err
}
}

return nil
}

Expand Down
50 changes: 49 additions & 1 deletion pkg/components/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

aws "github.com/validator-labs/validator-plugin-aws/api/v1alpha1"
azure "github.com/validator-labs/validator-plugin-azure/api/v1alpha1"
maas "github.com/validator-labs/validator-plugin-maas/api/v1alpha1"
network "github.com/validator-labs/validator-plugin-network/api/v1alpha1"
oci "github.com/validator-labs/validator-plugin-oci/api/v1alpha1"
vsphereapi "github.com/validator-labs/validator-plugin-vsphere/api/v1alpha1"
Expand Down Expand Up @@ -39,6 +40,7 @@ type ValidatorConfig struct {
NetworkPlugin *NetworkPluginConfig `yaml:"networkPlugin,omitempty"`
OCIPlugin *OCIPluginConfig `yaml:"ociPlugin,omitempty"`
VspherePlugin *VspherePluginConfig `yaml:"vspherePlugin,omitempty"`
MaasPlugin *MaasPluginConfig `yaml:"maasPlugin,omitempty"`
}

// NewValidatorConfig creates a new ValidatorConfig object.
Expand Down Expand Up @@ -79,6 +81,10 @@ func NewValidatorConfig() *ValidatorConfig {
StaticDeploymentTypes: make(map[int]string),
StaticDeploymentValues: make(map[int]*AzureStaticDeploymentValues),
},
MaasPlugin: &MaasPluginConfig{
Release: &validator.HelmRelease{},
Validator: &maas.MaasValidatorSpec{},
},
NetworkPlugin: &NetworkPluginConfig{
Release: &validator.HelmRelease{},
HTTPFileAuths: make([][]string, 0),
Expand All @@ -101,7 +107,7 @@ func NewValidatorConfig() *ValidatorConfig {

// AnyPluginEnabled returns true if any plugin is enabled.
func (c *ValidatorConfig) AnyPluginEnabled() bool {
return c.AWSPlugin.Enabled || c.NetworkPlugin.Enabled || c.VspherePlugin.Enabled || c.OCIPlugin.Enabled || c.AzurePlugin.Enabled
return c.AWSPlugin.Enabled || c.NetworkPlugin.Enabled || c.VspherePlugin.Enabled || c.OCIPlugin.Enabled || c.AzurePlugin.Enabled || c.MaasPlugin.Enabled
}

// EnabledPluginsHaveRules returns true if all enabled plugins have at least one rule configured.
Expand All @@ -115,6 +121,10 @@ func (c *ValidatorConfig) EnabledPluginsHaveRules() (bool, []string) {
invalidPlugins = append(invalidPlugins, "Azure")
// invalidPlugins = append(invalidPlugins, c.AzurePlugin.Validator.PluginCode())
}
if c.MaasPlugin.Enabled && c.MaasPlugin.Validator.ResultCount() == 0 {
// invalidPlugins = append(invalidPlugins, c.MaasPlugin.Validator.PluginCode())
invalidPlugins = append(invalidPlugins, "MAAS")
}
if c.NetworkPlugin.Enabled && c.NetworkPlugin.Validator.ResultCount() == 0 {
invalidPlugins = append(invalidPlugins, c.NetworkPlugin.Validator.PluginCode())
}
Expand Down Expand Up @@ -153,6 +163,11 @@ func (c *ValidatorConfig) decrypt() error {
return errors.Wrap(err, "failed to decrypt Azure plugin configuration")
}
}
if c.MaasPlugin != nil {
if err := c.MaasPlugin.decrypt(); err != nil {
return errors.Wrap(err, "failed to decrypt MAAS plugin configuration")
}
}
if c.NetworkPlugin != nil {
if err := c.NetworkPlugin.decrypt(); err != nil {
return errors.Wrap(err, "failed to decrypt Network plugin configuration")
Expand Down Expand Up @@ -193,6 +208,11 @@ func (c *ValidatorConfig) encrypt() error {
return errors.Wrap(err, "failed to encrypt Azure plugin configuration")
}
}
if c.MaasPlugin != nil {
if err := c.MaasPlugin.encrypt(); err != nil {
return errors.Wrap(err, "failed to encrypt MAAS plugin configuration")
}
}
if c.NetworkPlugin != nil {
if err := c.NetworkPlugin.encrypt(); err != nil {
return errors.Wrap(err, "failed to encrypt Network plugin configuration")
Expand Down Expand Up @@ -564,6 +584,34 @@ type VsphereTagRule struct {
vsphereapi.TagValidationRule `yaml:",inline"`
}

// MaasPluginConfig represents the MAAS plugin configuration.
type MaasPluginConfig struct {
Enabled bool `yaml:"enabled"`
Release *validator.HelmRelease `yaml:"helmRelease"`
Validator *maas.MaasValidatorSpec `yaml:"validator"`
MaasAPIToken string `yaml:"maasApiToken"`
}

func (c *MaasPluginConfig) encrypt() error {
token, err := crypto.EncryptB64([]byte(c.MaasAPIToken))
if err != nil {
return errors.Wrap(err, "failed to encrypt token")
}
c.MaasAPIToken = token

return nil
}

func (c *MaasPluginConfig) decrypt() error {
bytes, err := crypto.DecryptB64(c.MaasAPIToken)
if err != nil {
return errors.Wrap(err, "failed to decrypt token")
}
c.MaasAPIToken = string(*bytes)

return nil
}

// PublicKeySecret represents a public key secret.
type PublicKeySecret struct {
Name string `yaml:"name"`
Expand Down
2 changes: 2 additions & 0 deletions pkg/config/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ const (

ValidatorPluginAws = "validator-plugin-aws"
ValidatorPluginAzure = "validator-plugin-azure"
ValidatorPluginMaas = "validator-plugin-maas"
ValidatorPluginNetwork = "validator-plugin-network"
ValidatorPluginOci = "validator-plugin-oci"
ValidatorPluginVsphere = "validator-plugin-vsphere"

ValidatorPluginAwsTemplate = "validator-rules-aws.tmpl"
ValidatorPluginAzureTemplate = "validator-rules-azure.tmpl"
ValidatorPluginMaasTemplate = "validator-rules-maas.tmpl"
ValidatorPluginNetworkTemplate = "validator-rules-network.tmpl"
ValidatorPluginOciTemplate = "validator-rules-oci.tmpl"
ValidatorPluginVsphereTemplate = "validator-rules-vsphere.tmpl"
Expand Down
1 change: 1 addition & 0 deletions pkg/config/versions.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var ValidatorChartVersions = map[string]string{
Validator: "v0.1.2",
ValidatorPluginAws: "v0.1.3",
ValidatorPluginAzure: "v0.0.15",
ValidatorPluginMaas: "v0.0.7",
ValidatorPluginNetwork: "v0.0.22",
ValidatorPluginOci: "v0.1.0",
ValidatorPluginVsphere: "v0.0.29",
Expand Down
Loading

0 comments on commit 3b2e499

Please sign in to comment.