diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/builtin/providers/ignition/resource_ignition_config.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/builtin/providers/ignition/resource_ignition_config.go | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/builtin/providers/ignition/resource_ignition_config.go b/vendor/github.com/hashicorp/terraform/builtin/providers/ignition/resource_ignition_config.go new file mode 100644 index 00000000..c75e50af --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/builtin/providers/ignition/resource_ignition_config.go @@ -0,0 +1,308 @@ +package ignition + +import ( + "encoding/json" + "fmt" + + "github.com/hashicorp/terraform/helper/schema" + + "github.com/coreos/ignition/config/types" +) + +var configReferenceResource = &schema.Resource{ + Schema: map[string]*schema.Schema{ + "source": &schema.Schema{ + Type: schema.TypeString, + ForceNew: true, + Required: true, + }, + "verification": &schema.Schema{ + Type: schema.TypeString, + ForceNew: true, + Optional: true, + }, + }, +} + +func resourceConfig() *schema.Resource { + return &schema.Resource{ + Exists: resourceIgnitionFileExists, + Read: resourceIgnitionFileRead, + Schema: map[string]*schema.Schema{ + "disks": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "arrays": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "filesystems": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "files": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "systemd": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "networkd": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "users": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "groups": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "replace": &schema.Schema{ + Type: schema.TypeList, + ForceNew: true, + Optional: true, + MaxItems: 1, + Elem: configReferenceResource, + }, + "append": &schema.Schema{ + Type: schema.TypeList, + ForceNew: true, + Optional: true, + Elem: configReferenceResource, + }, + "rendered": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func resourceIgnitionFileRead(d *schema.ResourceData, meta interface{}) error { + rendered, err := renderConfig(d, globalCache) + if err != nil { + return err + } + + if err := d.Set("rendered", rendered); err != nil { + return err + } + + d.SetId(hash(rendered)) + return nil +} + +func resourceIgnitionFileExists(d *schema.ResourceData, meta interface{}) (bool, error) { + rendered, err := renderConfig(d, globalCache) + if err != nil { + return false, err + } + + return hash(rendered) == d.Id(), nil +} + +func renderConfig(d *schema.ResourceData, c *cache) (string, error) { + i, err := buildConfig(d, c) + if err != nil { + return "", err + } + + bytes, err := json.MarshalIndent(i, " ", " ") + + if err != nil { + return "", err + } + + return string(bytes), nil +} + +func buildConfig(d *schema.ResourceData, c *cache) (*types.Config, error) { + var err error + config := &types.Config{} + config.Ignition, err = buildIgnition(d) + if err != nil { + return nil, err + } + + config.Storage, err = buildStorage(d, c) + if err != nil { + return nil, err + } + + config.Systemd, err = buildSystemd(d, c) + if err != nil { + return nil, err + } + + config.Networkd, err = buildNetworkd(d, c) + if err != nil { + return nil, err + } + + config.Passwd, err = buildPasswd(d, c) + if err != nil { + return nil, err + } + + return config, nil +} + +func buildIgnition(d *schema.ResourceData) (types.Ignition, error) { + var err error + + i := types.Ignition{} + i.Version.UnmarshalJSON([]byte(`"2.0.0"`)) + + rr := d.Get("replace.0").(map[string]interface{}) + if len(rr) != 0 { + i.Config.Replace, err = buildConfigReference(rr) + if err != nil { + return i, err + } + } + + ar := d.Get("append").([]interface{}) + if len(ar) != 0 { + for _, rr := range ar { + r, err := buildConfigReference(rr.(map[string]interface{})) + if err != nil { + return i, err + } + + i.Config.Append = append(i.Config.Append, *r) + } + } + + return i, nil +} + +func buildConfigReference(raw map[string]interface{}) (*types.ConfigReference, error) { + r := &types.ConfigReference{} + + src, err := buildURL(raw["source"].(string)) + if err != nil { + return nil, err + } + + r.Source = src + + hash, err := buildHash(raw["verification"].(string)) + if err != nil { + return nil, err + } + + r.Verification.Hash = &hash + + return r, nil +} + +func buildStorage(d *schema.ResourceData, c *cache) (types.Storage, error) { + storage := types.Storage{} + + for _, id := range d.Get("disks").([]interface{}) { + d, ok := c.disks[id.(string)] + if !ok { + return storage, fmt.Errorf("invalid disk %q, unknown disk id", id) + } + + storage.Disks = append(storage.Disks, *d) + } + + for _, id := range d.Get("arrays").([]interface{}) { + a, ok := c.arrays[id.(string)] + if !ok { + return storage, fmt.Errorf("invalid raid %q, unknown raid id", id) + } + + storage.Arrays = append(storage.Arrays, *a) + } + + for _, id := range d.Get("filesystems").([]interface{}) { + f, ok := c.filesystems[id.(string)] + if !ok { + return storage, fmt.Errorf("invalid filesystem %q, unknown filesystem id", id) + } + + storage.Filesystems = append(storage.Filesystems, *f) + } + + for _, id := range d.Get("files").([]interface{}) { + f, ok := c.files[id.(string)] + if !ok { + return storage, fmt.Errorf("invalid file %q, unknown file id", id) + } + + storage.Files = append(storage.Files, *f) + } + + return storage, nil + +} + +func buildSystemd(d *schema.ResourceData, c *cache) (types.Systemd, error) { + systemd := types.Systemd{} + + for _, id := range d.Get("systemd").([]interface{}) { + u, ok := c.systemdUnits[id.(string)] + if !ok { + return systemd, fmt.Errorf("invalid systemd unit %q, unknown systemd unit id", id) + } + + systemd.Units = append(systemd.Units, *u) + } + + return systemd, nil + +} + +func buildNetworkd(d *schema.ResourceData, c *cache) (types.Networkd, error) { + networkd := types.Networkd{} + + for _, id := range d.Get("networkd").([]interface{}) { + u, ok := c.networkdUnits[id.(string)] + if !ok { + return networkd, fmt.Errorf("invalid networkd unit %q, unknown networkd unit id", id) + } + + networkd.Units = append(networkd.Units, *u) + } + + return networkd, nil +} + +func buildPasswd(d *schema.ResourceData, c *cache) (types.Passwd, error) { + passwd := types.Passwd{} + + for _, id := range d.Get("users").([]interface{}) { + u, ok := c.users[id.(string)] + if !ok { + return passwd, fmt.Errorf("invalid user %q, unknown user id", id) + } + + passwd.Users = append(passwd.Users, *u) + } + + for _, id := range d.Get("groups").([]interface{}) { + g, ok := c.groups[id.(string)] + if !ok { + return passwd, fmt.Errorf("invalid group %q, unknown group id", id) + } + + passwd.Groups = append(passwd.Groups, *g) + } + + return passwd, nil + +} |