mirror of https://github.com/docker/docs.git
This adds a method to the Driver: PreCreateCheck. This can be used
where you want to run some prerequisite checks before attempting to create the machine. In the case of EC2, this is a check for an existing keypair. This can be used in the other drivers in the future as well. Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
9df4b0eb34
commit
57810b298d
|
|
@ -33,6 +33,10 @@ func (d *FakeDriver) GetState() (state.State, error) {
|
||||||
return d.MockState, nil
|
return d.MockState, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *FakeDriver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *FakeDriver) Create() error {
|
func (d *FakeDriver) Create() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,28 @@ func (d *Driver) DriverName() string {
|
||||||
return driverName
|
return driverName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) checkPrereqs() error {
|
||||||
|
// check for existing keypair
|
||||||
|
key, err := d.getClient().GetKeyPair(d.MachineName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if key != nil {
|
||||||
|
return fmt.Errorf("There is already a keypair with the name %s. Please either remove that keypair or use a different machine name.", d.MachineName)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return d.checkPrereqs()
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
|
if err := d.checkPrereqs(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
log.Infof("Launching instance...")
|
log.Infof("Launching instance...")
|
||||||
|
|
||||||
if err := d.createKeyPair(); err != nil {
|
if err := d.createKeyPair(); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package amz
|
||||||
|
|
||||||
|
type DescribeKeyPairsResponse struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
KeySet []KeyPair `xml:"keySet>item"`
|
||||||
|
}
|
||||||
|
|
@ -438,6 +438,42 @@ func (e *EC2) GetSubnets() ([]Subnet, error) {
|
||||||
return subnets, nil
|
return subnets, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *EC2) GetKeyPairs() ([]KeyPair, error) {
|
||||||
|
keyPairs := []KeyPair{}
|
||||||
|
resp, err := e.performStandardAction("DescribeKeyPairs")
|
||||||
|
if err != nil {
|
||||||
|
return keyPairs, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
contents, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return keyPairs, fmt.Errorf("Error reading AWS response body: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
unmarshalledResponse := DescribeKeyPairsResponse{}
|
||||||
|
if err = xml.Unmarshal(contents, &unmarshalledResponse); err != nil {
|
||||||
|
return keyPairs, fmt.Errorf("Error unmarshalling AWS response XML: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
keyPairs = unmarshalledResponse.KeySet
|
||||||
|
|
||||||
|
return keyPairs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EC2) GetKeyPair(name string) (*KeyPair, error) {
|
||||||
|
keyPairs, err := e.GetKeyPairs()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, key := range keyPairs {
|
||||||
|
if key.KeyName == name {
|
||||||
|
return &key, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (e *EC2) GetInstanceState(instanceId string) (state.State, error) {
|
func (e *EC2) GetInstanceState(instanceId string) (state.State, error) {
|
||||||
resp, err := e.performInstanceAction(instanceId, "DescribeInstances", nil)
|
resp, err := e.performInstanceAction(instanceId, "DescribeInstances", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,8 @@ type ImportKeyPairResponse struct {
|
||||||
KeyFingerprint string `xml:"keyFingerprint"`
|
KeyFingerprint string `xml:"keyFingerprint"`
|
||||||
KeyMaterial []byte `xml:"keyMaterial"`
|
KeyMaterial []byte `xml:"keyMaterial"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type KeyPair struct {
|
||||||
|
KeyFingerprint string `xml:"keyFingerprint"`
|
||||||
|
KeyName string `xml:"keyName"`
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -171,6 +171,10 @@ func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (driver *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (driver *Driver) Create() error {
|
func (driver *Driver) Create() error {
|
||||||
if err := driver.setUserSubscription(); err != nil {
|
if err := driver.setUserSubscription(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,10 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
log.Infof("Creating SSH key...")
|
log.Infof("Creating SSH key...")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,9 @@ type Driver interface {
|
||||||
// GetState returns the state that the host is in (running, stopped, etc)
|
// GetState returns the state that the host is in (running, stopped, etc)
|
||||||
GetState() (state.State, error)
|
GetState() (state.State, error)
|
||||||
|
|
||||||
|
// PreCreate allows for pre-create operations to make sure a driver is ready for creation
|
||||||
|
PreCreateCheck() error
|
||||||
|
|
||||||
// Create a host using the driver's config
|
// Create a host using the driver's config
|
||||||
Create() error
|
Create() error
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,10 @@ func (driver *Driver) initApis() (*ComputeUtil, error) {
|
||||||
return newComputeUtil(driver)
|
return newComputeUtil(driver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Create creates a GCE VM instance acting as a docker host.
|
// Create creates a GCE VM instance acting as a docker host.
|
||||||
func (driver *Driver) Create() error {
|
func (driver *Driver) Create() error {
|
||||||
c, err := newComputeUtil(driver)
|
c, err := newComputeUtil(driver)
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,10 @@ func (d *Driver) GetState() (state.State, error) {
|
||||||
return state.None, nil
|
return state.None, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -312,6 +312,10 @@ func (d *Driver) GetState() (state.State, error) {
|
||||||
return state.None, nil
|
return state.None, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
d.KeyPairName = fmt.Sprintf("%s-%s", d.MachineName, utils.GenerateRandomID())
|
d.KeyPairName = fmt.Sprintf("%s-%s", d.MachineName, utils.GenerateRandomID())
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -289,6 +289,10 @@ func (d *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) {
|
||||||
return ssh.GetSSHCommand(d.IPAddress, 22, "root", d.sshKeyPath(), args...), nil
|
return ssh.GetSSHCommand(d.IPAddress, 22, "root", d.sshKeyPath(), args...), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
waitForStart := func() {
|
waitForStart := func() {
|
||||||
log.Infof("Waiting for host to become available")
|
log.Infof("Waiting for host to become available")
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,10 @@ func cpIso(src, dest string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,10 @@ func (d *Driver) GetState() (state.State, error) {
|
||||||
return state.Stopped, nil
|
return state.Stopped, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
|
|
@ -260,6 +260,10 @@ func (d *Driver) GetState() (state.State, error) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Create() error {
|
func (d *Driver) Create() error {
|
||||||
|
|
||||||
key, err := d.createSSHKey()
|
key, err := d.createSSHKey()
|
||||||
|
|
|
||||||
|
|
@ -215,6 +215,10 @@ func (d *Driver) GetState() (state.State, error) {
|
||||||
return state.None, nil
|
return state.None, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) PreCreateCheck() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// the current implementation does the following:
|
// the current implementation does the following:
|
||||||
// 1. check whether the docker directory contains the boot2docker ISO
|
// 1. check whether the docker directory contains the boot2docker ISO
|
||||||
// 2. generate an SSH keypair
|
// 2. generate an SSH keypair
|
||||||
|
|
|
||||||
6
store.go
6
store.go
|
|
@ -31,7 +31,7 @@ func (s *Store) Create(name string, driverName string, flags drivers.DriverOptio
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if exists {
|
if exists {
|
||||||
return nil, fmt.Errorf("Host %q already exists", name)
|
return nil, fmt.Errorf("Machine %s already exists", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
hostPath := filepath.Join(s.Path, name)
|
hostPath := filepath.Join(s.Path, name)
|
||||||
|
|
@ -46,6 +46,10 @@ func (s *Store) Create(name string, driverName string, flags drivers.DriverOptio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := host.Driver.PreCreateCheck(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(hostPath, 0700); err != nil {
|
if err := os.MkdirAll(hostPath, 0700); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue