Add BMH manager executor api object

Also this commit extends helper interface with inventory

Change-Id: I8df785f1c095a2e9502f23e1c83c5fcfe6f811fd
This commit is contained in:
Kostiantyn Kalynovskyi 2021-01-23 01:46:37 +00:00 committed by Kostyantyn Kalynovskyi
parent 9bd01de3da
commit 3f9e56ecef
7 changed files with 177 additions and 47 deletions

View File

@ -0,0 +1,76 @@
/*
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
https://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 v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +kubebuilder:object:root=true
// BaremetalManager allows execution of control operations against baremetal hosts
type BaremetalManager struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec BaremetalManagerSpec `json:"spec"`
}
// BaremetalManagerSpec holds configuration for baremetal manager
type BaremetalManagerSpec struct {
Operation BaremetalOperation `json:"operation"`
HostSelector BaremetalHostSelector `json:"hostSelector"`
OperationOptions BaremetalOperationOptions `json:"operationOptions"`
// Timeout in seconds
Timeout int `json:"timeout"`
}
// BaremetalOperationOptions hold operation options
type BaremetalOperationOptions struct {
RemoteDirect RemoteDirectOptions `json:"remoteDirect"`
}
// RemoteDirectOptions holds configuration for remote direct operation
type RemoteDirectOptions struct {
ISOURL string `json:"isoURL"`
}
// BaremetalHostSelector allows to select a host by label selector, by name and namespace
type BaremetalHostSelector struct {
LabelSelector string `json:"labelSelector"`
Name string `json:"name"`
Namespace string `json:"namespace"`
}
// BaremetalOperation defines an operation to be performed against baremetal host
type BaremetalOperation string
const (
// BaremetalOperationReboot reboot
BaremetalOperationReboot BaremetalOperation = "reboot"
// BaremetalOperationPowerOff power off
BaremetalOperationPowerOff BaremetalOperation = "power-off"
// BaremetalOperationPowerOn power on
BaremetalOperationPowerOn BaremetalOperation = "power-on"
// BaremetalOperationRemoteDirect boot iso with given url
BaremetalOperationRemoteDirect BaremetalOperation = "remote-direct"
// BaremetalOperationEjectVirtualMedia eject virtual media
BaremetalOperationEjectVirtualMedia BaremetalOperation = "eject-virtual-media"
)
// DefaultBaremetalManager returns BaremetalManager executor document with default values
func DefaultBaremetalManager() *BaremetalManager {
return &BaremetalManager{Spec: BaremetalManagerSpec{Timeout: 300}}
}

View File

@ -47,12 +47,12 @@ func init() {
&KubeConfig{},
&KubernetesApply{},
&IsoConfiguration{},
&RemoteDirectConfiguration{},
&ClusterMap{},
&ReplacementTransformer{},
&Templater{},
&BootConfiguration{},
&GenericContainer{},
&BaremetalManager{},
)
_ = AddToScheme(Scheme) //nolint:errcheck
}

View File

@ -1,31 +0,0 @@
/*
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 v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +kubebuilder:object:root=true
// RemoteDirectConfiguration structure is inherited from apimachinery TypeMeta and ObjectMeta structures
// and defines parameters used to bootstrap the ephemeral node during the remote direct
type RemoteDirectConfiguration struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// IsoURL specifies url to download ISO image for ephemeral node
IsoURL string `json:"isoUrl,omitempty"`
}

View File

@ -70,6 +70,80 @@ func (in *ApplyWaitOptions) DeepCopy() *ApplyWaitOptions {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BaremetalHostSelector) DeepCopyInto(out *BaremetalHostSelector) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaremetalHostSelector.
func (in *BaremetalHostSelector) DeepCopy() *BaremetalHostSelector {
if in == nil {
return nil
}
out := new(BaremetalHostSelector)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BaremetalManager) DeepCopyInto(out *BaremetalManager) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaremetalManager.
func (in *BaremetalManager) DeepCopy() *BaremetalManager {
if in == nil {
return nil
}
out := new(BaremetalManager)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *BaremetalManager) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BaremetalManagerSpec) DeepCopyInto(out *BaremetalManagerSpec) {
*out = *in
out.HostSelector = in.HostSelector
out.OperationOptions = in.OperationOptions
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaremetalManagerSpec.
func (in *BaremetalManagerSpec) DeepCopy() *BaremetalManagerSpec {
if in == nil {
return nil
}
out := new(BaremetalManagerSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BaremetalOperationOptions) DeepCopyInto(out *BaremetalOperationOptions) {
*out = *in
out.RemoteDirect = in.RemoteDirect
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaremetalOperationOptions.
func (in *BaremetalOperationOptions) DeepCopy() *BaremetalOperationOptions {
if in == nil {
return nil
}
out := new(BaremetalOperationOptions)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BootConfiguration) DeepCopyInto(out *BootConfiguration) {
*out = *in
@ -574,30 +648,20 @@ func (in *Provider) DeepCopy() *Provider {
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RemoteDirectConfiguration) DeepCopyInto(out *RemoteDirectConfiguration) {
func (in *RemoteDirectOptions) DeepCopyInto(out *RemoteDirectOptions) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteDirectConfiguration.
func (in *RemoteDirectConfiguration) DeepCopy() *RemoteDirectConfiguration {
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteDirectOptions.
func (in *RemoteDirectOptions) DeepCopy() *RemoteDirectOptions {
if in == nil {
return nil
}
out := new(RemoteDirectConfiguration)
out := new(RemoteDirectOptions)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *RemoteDirectConfiguration) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplacementTransformer.
func (in *ReplacementTransformer) DeepCopy() *ReplacementTransformer {
if in == nil {

View File

@ -23,6 +23,8 @@ import (
"opendev.org/airship/airshipctl/pkg/cluster/clustermap"
"opendev.org/airship/airshipctl/pkg/config"
"opendev.org/airship/airshipctl/pkg/document"
"opendev.org/airship/airshipctl/pkg/inventory"
inventoryifc "opendev.org/airship/airshipctl/pkg/inventory/ifc"
"opendev.org/airship/airshipctl/pkg/phase/ifc"
"opendev.org/airship/airshipctl/pkg/util"
)
@ -34,7 +36,9 @@ type Helper struct {
targetPath string
phaseRepoDir string
phaseEntryPointBasePath string
metadata *config.Metadata
inventory inventoryifc.Inventory
metadata *config.Metadata
}
// NewHelper constructs metadata interface based on config
@ -58,6 +62,7 @@ func NewHelper(cfg *config.Config) (ifc.Helper, error) {
helper.inventoryRoot = filepath.Join(helper.targetPath, helper.phaseRepoDir, helper.metadata.Inventory.Path)
helper.phaseEntryPointBasePath = filepath.Join(helper.targetPath, helper.phaseRepoDir,
helper.metadata.PhaseMeta.DocEntryPointPrefix)
helper.inventory = inventory.NewInventory(func() (*config.Config, error) { return cfg, nil })
return helper, nil
}
@ -268,3 +273,8 @@ func (helper *Helper) PhaseEntryPointBasePath() string {
func (helper *Helper) WorkDir() (string, error) {
return filepath.Join(util.UserHomeDir(), config.AirshipConfigDir), nil
}
// Inventory return inventory interface
func (helper *Helper) Inventory() (inventoryifc.Inventory, error) {
return helper.inventory, nil
}

View File

@ -510,6 +510,15 @@ func TestHelperWorkdir(t *testing.T) {
assert.Greater(t, len(workDir), 0)
}
func TestHelperInventory(t *testing.T) {
helper, err := phase.NewHelper(testConfig(t))
require.NoError(t, err)
require.NotNil(t, helper)
inv, err := helper.Inventory()
assert.NoError(t, err)
assert.NotNil(t, inv)
}
func testConfig(t *testing.T) *config.Config {
t.Helper()
confString := `apiVersion: airshipit.org/v1alpha1

View File

@ -18,6 +18,7 @@ import (
"opendev.org/airship/airshipctl/pkg/api/v1alpha1"
"opendev.org/airship/airshipctl/pkg/cluster/clustermap"
"opendev.org/airship/airshipctl/pkg/document"
"opendev.org/airship/airshipctl/pkg/inventory/ifc"
)
// Helper is a phase helper that provides phases with additional config related information
@ -34,5 +35,6 @@ type Helper interface {
ClusterMap() (clustermap.ClusterMap, error)
ExecutorDoc(phaseID ID) (document.Document, error)
PhaseBundleRoot() string
Inventory() (ifc.Inventory, error)
PhaseEntryPointBasePath() string
}