This repository has been archived by the owner on Oct 30, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
inventory.go
89 lines (72 loc) · 2.52 KB
/
inventory.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
/*
Copyright © 2021 Bedag Informatik AG
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 inventory
import (
"fmt"
"regexp"
invconfig "github.com/bedag/kusible/pkg/inventory/config"
"github.com/bedag/kusible/pkg/values"
"github.com/bedag/kusible/pkg/wrapper/ejson"
"github.com/imdario/mergo"
)
func NewInventory(path string, ejson ejson.Settings, skipKubeconfig bool, defaulClusterInventoryConfig invconfig.ClusterInventory) (*Inventory, error) {
// load the raw inventory yaml data
raw, err := values.New(path, []string{}, false, ejson)
if err != nil {
return nil, err
}
data := raw.Map()
// parse the yaml data into the inventory config
inventoryConfig, err := invconfig.NewConfigFromMap(&data)
if err != nil {
return nil, fmt.Errorf("failed load inventory config: %s", err)
}
// create the inventory based on the inventory config
entries := make(map[string]*Entry, len(inventoryConfig.Inventory))
for _, entryConf := range inventoryConfig.Inventory {
clusterInventoryConfig := defaulClusterInventoryConfig
err = mergo.Merge(&clusterInventoryConfig, entryConf.ClusterInventory, mergo.WithOverride)
if err != nil {
return nil, err
}
entryConf.ClusterInventory = clusterInventoryConfig
entry, err := NewEntryFromConfigWithDefaults(entryConf)
if err != nil {
return nil, fmt.Errorf("failed to create entry '%s' from config: %s", entryConf.Name, err)
}
entries[entryConf.Name] = entry
}
return &Inventory{entries: entries, ejson: &ejson}, nil
}
func (i *Inventory) Entries() map[string]*Entry {
return i.entries
}
func (i *Inventory) EntryNames(filter string, limits []string) ([]string, error) {
var result []string
regex, err := regexp.Compile("^" + filter + "$")
if err != nil {
return nil, fmt.Errorf("inventory entry filter '%s' is not a valid regex: %s", filter, err)
}
for _, entry := range i.entries {
if regex.MatchString(entry.name) {
valid, err := entry.MatchLimits(limits)
if err != nil {
return nil, err
}
if valid {
result = append(result, entry.name)
}
}
}
return result, nil
}