2019-12-18 19:31:29 +00:00
/ *
Copyright 2019 The Kubernetes Authors All rights reserved .
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 addons
import (
2024-08-14 17:31:53 +00:00
"errors"
2019-12-18 19:31:29 +00:00
"fmt"
2020-08-06 15:25:06 +00:00
"strconv"
2019-12-18 19:31:29 +00:00
2021-05-20 16:09:07 +00:00
"github.com/spf13/viper"
2020-08-06 15:25:06 +00:00
"k8s.io/minikube/pkg/minikube/assets"
2019-12-18 19:31:29 +00:00
"k8s.io/minikube/pkg/minikube/config"
"k8s.io/minikube/pkg/minikube/cruntime"
2024-07-04 14:53:25 +00:00
"k8s.io/minikube/pkg/minikube/driver"
2020-08-06 15:25:06 +00:00
"k8s.io/minikube/pkg/minikube/out"
2019-12-18 19:31:29 +00:00
)
2020-08-06 15:25:06 +00:00
const volumesnapshotsAddon = "volumesnapshots"
2019-12-18 19:31:29 +00:00
// containerdOnlyMsg is the message shown when a containerd-only addon is enabled
const containerdOnlyAddonMsg = `
This addon can only be enabled with the containerd runtime backend . To enable this backend , please first stop minikube with :
minikube stop
and then start minikube again with the following flags :
minikube start -- container - runtime = containerd -- docker - opt containerd = / var / run / containerd / containerd . sock `
2020-08-06 15:25:06 +00:00
// volumesnapshotsDisabledMsg is the message shown when csi-hostpath-driver addon is enabled without the volumesnapshots addon
const volumesnapshotsDisabledMsg = ` [ WARNING ] For full functionality , the ' csi - hostpath - driver ' addon requires the ' volumesnapshots ' addon to be enabled .
You can enable ' volumesnapshots ' addon by running : ' minikube addons enable volumesnapshots '
`
2024-07-04 14:53:25 +00:00
func isRuntimeContainerd ( cc * config . ClusterConfig , _ , _ string ) error {
2020-03-11 00:49:47 +00:00
r , err := cruntime . New ( cruntime . Config { Type : cc . KubernetesConfig . ContainerRuntime } )
2019-12-18 19:31:29 +00:00
if err != nil {
return err
}
_ , ok := r . ( * cruntime . Containerd )
if ! ok {
2024-08-14 17:31:53 +00:00
return errors . New ( containerdOnlyAddonMsg )
2019-12-18 19:31:29 +00:00
}
return nil
}
2019-12-19 06:02:08 +00:00
2024-07-04 14:53:25 +00:00
// isVolumesnapshotsEnabled is a validator that prints out a warning if the volumesnapshots addon
2020-08-06 15:25:06 +00:00
// is disabled (does not return any errors!)
2024-07-04 14:53:25 +00:00
func isVolumesnapshotsEnabled ( cc * config . ClusterConfig , _ , value string ) error {
2020-08-06 15:25:06 +00:00
isCsiDriverEnabled , _ := strconv . ParseBool ( value )
// assets.Addons[].IsEnabled() returns the current status of the addon or default value.
// config.AddonList contains list of addons to be enabled.
2021-05-21 08:09:05 +00:00
addonList := viper . GetStringSlice ( config . AddonListFlag )
2021-05-20 16:09:07 +00:00
isVolumesnapshotsEnabled := assets . Addons [ volumesnapshotsAddon ] . IsEnabled ( cc ) || contains ( addonList , volumesnapshotsAddon )
2020-08-06 15:25:06 +00:00
if isCsiDriverEnabled && ! isVolumesnapshotsEnabled {
// just print out a warning directly, we don't want to return any errors since
// that would prevent the addon from being enabled (callbacks wouldn't be run)
out . WarningT ( volumesnapshotsDisabledMsg )
}
return nil
}
2024-07-04 14:53:25 +00:00
func isKVMDriverForNVIDIA ( cc * config . ClusterConfig , name , _ string ) error {
if driver . IsKVM ( cc . Driver ) {
return nil
}
out . Ln ( "" )
out . FailureT ( "The {{.addon}} addon is only supported with the KVM driver.\n\nFor GPU setup instructions see: https://minikube.sigs.k8s.io/docs/tutorials/nvidia/" , out . V { "addon" : name } )
return fmt . Errorf ( "%s addon is only supported with the KVM driver" , name )
}
2019-12-19 06:21:53 +00:00
// isAddonValid returns the addon, true if it is valid
2019-12-19 06:02:08 +00:00
// otherwise returns nil, false
2019-12-19 06:21:53 +00:00
func isAddonValid ( name string ) ( * Addon , bool ) {
2019-12-19 06:02:08 +00:00
for _ , a := range Addons {
if a . name == name {
return a , true
}
}
return nil , false
}
2020-08-06 15:25:06 +00:00
func contains ( slice [ ] string , val string ) bool {
for _ , item := range slice {
if item == val {
return true
}
}
return false
}