1
0
mirror of https://github.com/coreos/ignition.git synced 2026-02-06 18:47:54 +01:00
Files
ignition/internal/platform/platform.go
2024-10-14 15:33:52 +02:00

137 lines
3.7 KiB
Go

// Copyright 2015 CoreOS, Inc.
//
// 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 platform
import (
"errors"
"fmt"
"github.com/coreos/ignition/v2/config/v3_6_experimental/types"
"github.com/coreos/ignition/v2/internal/log"
"github.com/coreos/ignition/v2/internal/registry"
"github.com/coreos/ignition/v2/internal/resource"
"github.com/coreos/ignition/v2/internal/state"
"github.com/coreos/vcontext/report"
)
var (
ErrCannotDelete = errors.New("cannot delete config on this platform")
ErrNoProvider = errors.New("config provider was not online")
)
// Config defines the capabilities of a particular platform, for use by the
// rest of Ignition.
type Config struct {
// don't allow direct access to fields
p Provider
}
// Provider is the struct that platform implementations use to define their
// capabilities for use by this package.
type Provider struct {
Name string
NewFetcher func(logger *log.Logger) (resource.Fetcher, error)
Fetch func(f *resource.Fetcher) (types.Config, report.Report, error)
Init func(f *resource.Fetcher) error
Status func(stageName string, f resource.Fetcher, e error) error
DelConfig func(f *resource.Fetcher) error
// Fetch, and also save output files to be written during files stage.
// Avoid, unless you're certain you need it.
FetchWithFiles func(f *resource.Fetcher) ([]types.File, types.Config, report.Report, error)
}
func (c Config) Name() string {
return c.p.Name
}
func (c Config) Fetch(f *resource.Fetcher, state *state.State) (types.Config, report.Report, error) {
if c.p.FetchWithFiles != nil {
files, config, report, err := c.p.FetchWithFiles(f)
state.ProviderOutputFiles = files
return config, report, err
} else {
return c.p.Fetch(f)
}
}
func (c Config) NewFetcher(l *log.Logger) (resource.Fetcher, error) {
if c.p.NewFetcher != nil {
return c.p.NewFetcher(l)
} else {
return resource.Fetcher{
Logger: l,
}, nil
}
}
// Init performs additional fetcher configuration post-config fetch. This
// ensures that networking is already available if a platform needs to reach
// out to the metadata service to fetch additional options / data.
func (c Config) Init(f *resource.Fetcher) error {
if c.p.Init != nil {
return c.p.Init(f)
}
return nil
}
// Status takes a Fetcher and the error from Run (from engine)
func (c Config) Status(stageName string, f resource.Fetcher, statusErr error) error {
if c.p.Status != nil {
return c.p.Status(stageName, f, statusErr)
}
return nil
}
func (c Config) DelConfig(f *resource.Fetcher) error {
if c.p.DelConfig != nil {
return c.p.DelConfig(f)
} else {
return ErrCannotDelete
}
}
var configs = registry.Create("platform configs")
func Register(provider Provider) {
configs.Register(NewConfig(provider))
}
// Helper function for wrapping a Provider, for use by specialized providers
// that don't want to add themselves to the registry.
func NewConfig(provider Provider) Config {
return Config{
p: provider,
}
}
func Get(name string) (config Config, ok bool) {
config, ok = configs.Get(name).(Config)
return
}
func MustGet(name string) Config {
if config, ok := Get(name); ok {
return config
} else {
panic(fmt.Sprintf("invalid platform name %q provided", name))
}
}
func Names() (names []string) {
return configs.Names()
}