~thumper/juju-core/fix-upstart-start-race

« back to all changes in this revision

Viewing changes to provider/joyent/environ.go

  • Committer: Tarmac
  • Author(s): Daniele Stroppa
  • Date: 2013-11-21 17:53:05 UTC
  • mfrom: (1953.1.17 juju-core)
  • Revision ID: tarmac-20131121175305-pzsz7j7oitdew42r
[r=gz] provider/joyent: Initial work towards joyent provider

Outline for new backend for running juju on the joyent cloud,
based on the skeleton provider. The gojoyent library will need
to get imported and used in a followup branch for actual use.

R=fwereade, gz

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2013 Joyent Inc.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package joyent
 
5
 
 
6
import (
 
7
        "sync"
 
8
 
 
9
        "launchpad.net/juju-core/constraints"
 
10
        "launchpad.net/juju-core/environs"
 
11
        "launchpad.net/juju-core/environs/config"
 
12
        "launchpad.net/juju-core/environs/storage"
 
13
        "launchpad.net/juju-core/provider/common"
 
14
        "launchpad.net/juju-core/state"
 
15
        "launchpad.net/juju-core/state/api"
 
16
)
 
17
 
 
18
// This file contains the core of the joyent Environ implementation. You will
 
19
// probably not need to change this file very much to begin with; and if you
 
20
// never need to add any more fields, you may never need to touch it.
 
21
//
 
22
// The rest of the implementation is split into environ_instance.go (which
 
23
// must be implemented ) and environ_firewall.go (which can be safely
 
24
// ignored until you've got an environment bootstrapping successfully).
 
25
 
 
26
type environ struct {
 
27
        name string
 
28
        // All mutating operations should lock the mutex. Non-mutating operations
 
29
        // should read all fields (other than name, which is immutable) from a
 
30
        // shallow copy taken with getSnapshot().
 
31
        // This advice is predicated on the goroutine-safety of the values of the
 
32
        // affected fields.
 
33
        lock    sync.Mutex
 
34
        ecfg    *environConfig
 
35
        storage storage.Storage
 
36
}
 
37
 
 
38
var _ environs.Environ = (*environ)(nil)
 
39
 
 
40
func (env *environ) Name() string {
 
41
        return env.name
 
42
}
 
43
 
 
44
func (*environ) Provider() environs.EnvironProvider {
 
45
        return providerInstance
 
46
}
 
47
 
 
48
func (env *environ) SetConfig(cfg *config.Config) error {
 
49
        env.lock.Lock()
 
50
        defer env.lock.Unlock()
 
51
        ecfg, err := validateConfig(cfg, env.ecfg)
 
52
        if err != nil {
 
53
                return err
 
54
        }
 
55
        storage, err := newStorage(ecfg)
 
56
        if err != nil {
 
57
                return err
 
58
        }
 
59
        env.ecfg = ecfg
 
60
        env.storage = storage
 
61
        return nil
 
62
}
 
63
 
 
64
func (env *environ) getSnapshot() *environ {
 
65
        env.lock.Lock()
 
66
        clone := *env
 
67
        env.lock.Unlock()
 
68
        clone.lock = sync.Mutex{}
 
69
        return &clone
 
70
}
 
71
 
 
72
func (env *environ) Config() *config.Config {
 
73
        return env.getSnapshot().ecfg.Config
 
74
}
 
75
 
 
76
func (env *environ) Storage() storage.Storage {
 
77
        return env.getSnapshot().storage
 
78
}
 
79
 
 
80
func (env *environ) PublicStorage() storage.StorageReader {
 
81
        return environs.EmptyStorage
 
82
}
 
83
 
 
84
func (env *environ) Bootstrap(cons constraints.Value) error {
 
85
        return common.Bootstrap(env, cons)
 
86
}
 
87
 
 
88
func (env *environ) StateInfo() (*state.Info, *api.Info, error) {
 
89
        return common.StateInfo(env)
 
90
}
 
91
 
 
92
func (env *environ) Destroy() error {
 
93
        return common.Destroy(env)
 
94
}