This repository has been archived by the owner on Oct 30, 2023. It is now read-only.
/
types.go
101 lines (88 loc) · 3.16 KB
/
types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
Copyright © 2019 Michael Gruener
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package config
import "github.com/mitchellh/mapstructure"
// Config holds the list of entries that can serve as targets
// for application deployments. It is the root of the actual inventory
type Config struct {
Inventory []*Entry `json:"inventory"`
}
// Entry is a single inventory entry representing a possible deploy
// target.
type Entry struct {
// Name to uniquely identify the entry
Name string `json:"name"`
// Groups is a "least specific to most specific" ordered list of
// groups associated with this entry, used to compile the "values"
// for this entry and as selector to target entries in specific groups.
// Each entry is always part of the "all" group and a group
// with the name of the entry.
Groups []string `json:"groups"`
// ConfigNamespace refers to the namespace where the "cluster-inventory"
// ConfigMap can be found
ConfigNamespace string `json:"config_namespace"`
// Kubeconfig holds the kubeconfig loader configuration
Kubeconfig *Kubeconfig `json:"kubeconfig"`
}
// Kubeconfig holds information on how / where to retrieve / generate
// the Kubeconfig for an entry in the inventory
type Kubeconfig struct {
Backend string `json:"backend"`
Params *Params `json:"params"`
}
// Params holds the parameters used by a kubeconfig backend to
// retrieve / generate a kubeconfig. The exact fields depend
// on the kubeconfig loader.
type Params map[string]interface{}
// decode the given data with the default decoder settings
func decode(data *map[string]interface{}, result interface{}) error {
// TODO: check https://github.com/mitchellh/mapstructure/issues/187 to
// support mitchellh/mapstructure > 1.3.1
decoderConfig := &mapstructure.DecoderConfig{
ZeroFields: true,
ErrorUnused: false,
WeaklyTypedInput: true,
TagName: "json",
Result: &result,
}
decoder, err := mapstructure.NewDecoder(decoderConfig)
if err != nil {
return err
}
err = decoder.Decode(data)
return err
}
// NewConfigFromMap takes raw config data and parses it into an
// inventory config
func NewConfigFromMap(data *map[string]interface{}) (*Config, error) {
var config Config
err := decode(data, &config)
if config.Inventory == nil {
config.Inventory = make([]*Entry, 0)
}
for index := range config.Inventory {
if config.Inventory[index].Kubeconfig == nil {
config.Inventory[index].Kubeconfig = new(Kubeconfig)
}
if config.Inventory[index].Kubeconfig.Params == nil {
config.Inventory[index].Kubeconfig.Params = new(Params)
}
}
return &config, err
}
// NewConfig returns an empty inventory config
func NewConfig() *Config {
return &Config{
Inventory: make([]*Entry, 0),
}
}