mirror of https://github.com/k3s-io/k3s
Make cloud providers be plugins
parent
eb9f3394c5
commit
f7d54390f9
|
@ -28,8 +28,6 @@ import (
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/gce"
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/vagrant"
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
verflag "github.com/GoogleCloudPlatform/kubernetes/pkg/version/flag"
|
verflag "github.com/GoogleCloudPlatform/kubernetes/pkg/version/flag"
|
||||||
|
@ -77,23 +75,13 @@ func main() {
|
||||||
glog.Fatalf("-etcd_servers flag is required.")
|
glog.Fatalf("-etcd_servers flag is required.")
|
||||||
}
|
}
|
||||||
|
|
||||||
var cloud cloudprovider.Interface
|
cloud, err := cloudprovider.GetCloudProvider(*cloudProvider)
|
||||||
switch *cloudProvider {
|
|
||||||
case "gce":
|
|
||||||
var err error
|
|
||||||
cloud, err = gce_cloud.NewGCECloud()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Couldn't connect to GCE cloud: %#v", err)
|
glog.Fatalf("Couldn't init cloud provider %q: %#v", *cloudProvider, err)
|
||||||
}
|
}
|
||||||
case "vagrant":
|
if cloud == nil {
|
||||||
var err error
|
|
||||||
cloud, err = vagrant_cloud.NewVagrantCloud()
|
|
||||||
if err != nil {
|
|
||||||
glog.Fatalf("Couldn't connect to vagrant cloud: %#v", err)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if len(*cloudProvider) > 0 {
|
if len(*cloudProvider) > 0 {
|
||||||
glog.Infof("Unknown cloud provider: %s", *cloudProvider)
|
glog.Fatalf("Unknown cloud provider: %s", *cloudProvider)
|
||||||
} else {
|
} else {
|
||||||
glog.Info("No cloud provider specified.")
|
glog.Info("No cloud provider specified.")
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. 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 main
|
||||||
|
|
||||||
|
// This file exists to force the desired plugin implementations to be linked.
|
||||||
|
// This should probably be part of some configuration fed into the build for a
|
||||||
|
// given binary target.
|
||||||
|
import (
|
||||||
|
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/gce"
|
||||||
|
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/vagrant"
|
||||||
|
)
|
|
@ -39,6 +39,10 @@ type GCECloud struct {
|
||||||
instanceRE string
|
instanceRE string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
cloudprovider.RegisterCloudProvider("gce", func() (cloudprovider.Interface, error) { return newGCECloud() })
|
||||||
|
}
|
||||||
|
|
||||||
func getProjectAndZone() (string, string, error) {
|
func getProjectAndZone() (string, string, error) {
|
||||||
client := http.Client{}
|
client := http.Client{}
|
||||||
url := "http://metadata/computeMetadata/v1/instance/zone"
|
url := "http://metadata/computeMetadata/v1/instance/zone"
|
||||||
|
@ -63,8 +67,8 @@ func getProjectAndZone() (string, string, error) {
|
||||||
return parts[1], parts[3], nil
|
return parts[1], parts[3], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGCECloud creates a new instance of GCECloud.
|
// newGCECloud creates a new instance of GCECloud.
|
||||||
func NewGCECloud() (*GCECloud, error) {
|
func newGCECloud() (*GCECloud, error) {
|
||||||
projectID, zone, err := getProjectAndZone()
|
projectID, zone, err := getProjectAndZone()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. 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 cloudprovider
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Factory is a function that returns a cloudprovider.Interface.
|
||||||
|
type Factory func() (Interface, error)
|
||||||
|
|
||||||
|
// All registered cloud providers.
|
||||||
|
var providersMutex sync.Mutex
|
||||||
|
var providers = make(map[string]Factory)
|
||||||
|
|
||||||
|
// RegisterCloudProvider registers a cloudprovider.Factory by name. This
|
||||||
|
// is expected to happen during app startup.
|
||||||
|
func RegisterCloudProvider(name string, cloud Factory) {
|
||||||
|
providersMutex.Lock()
|
||||||
|
defer providersMutex.Unlock()
|
||||||
|
_, found := providers[name]
|
||||||
|
if found {
|
||||||
|
glog.Fatalf("Cloud provider %q was registered twice", name)
|
||||||
|
}
|
||||||
|
glog.Infof("Registered cloud provider %q", name)
|
||||||
|
providers[name] = cloud
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCloudProvider creates an instance of the named cloud provider, or nil if
|
||||||
|
// the name is not known. The error return is only used if the named provider
|
||||||
|
// was known but failed to initialize.
|
||||||
|
func GetCloudProvider(name string) (Interface, error) {
|
||||||
|
providersMutex.Lock()
|
||||||
|
defer providersMutex.Unlock()
|
||||||
|
f, found := providers[name]
|
||||||
|
if !found {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return f()
|
||||||
|
}
|
|
@ -36,6 +36,10 @@ type VagrantCloud struct {
|
||||||
saltAuth string
|
saltAuth string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
cloudprovider.RegisterCloudProvider("vagrant", func() (cloudprovider.Interface, error) { return newVagrantCloud() })
|
||||||
|
}
|
||||||
|
|
||||||
// SaltToken is an authorization token required by Salt REST API
|
// SaltToken is an authorization token required by Salt REST API
|
||||||
type SaltToken struct {
|
type SaltToken struct {
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
|
@ -63,8 +67,8 @@ type SaltMinionsResponse struct {
|
||||||
Minions []SaltMinions `json:"return"`
|
Minions []SaltMinions `json:"return"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewVagrantCloud creates a new instance of VagrantCloud configured to talk to the Salt REST API.
|
// newVagrantCloud creates a new instance of VagrantCloud configured to talk to the Salt REST API.
|
||||||
func NewVagrantCloud() (*VagrantCloud, error) {
|
func newVagrantCloud() (*VagrantCloud, error) {
|
||||||
return &VagrantCloud{
|
return &VagrantCloud{
|
||||||
saltURL: "http://127.0.0.1:8000",
|
saltURL: "http://127.0.0.1:8000",
|
||||||
saltUser: "vagrant",
|
saltUser: "vagrant",
|
||||||
|
|
Loading…
Reference in New Issue