~themue/juju-core/053-env-more-script-friendly

« back to all changes in this revision

Viewing changes to state/state.go

  • Committer: Dimiter Naydenov
  • Date: 2013-07-29 15:15:41 UTC
  • mto: This revision was merged to the branch mainline in revision 1565.
  • Revision ID: dimiter.naydenov@canonical.com-20130729151541-zm8murwo9u7mtsdu
names: new package

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
import (
10
10
        "fmt"
11
11
        "net/url"
12
 
        "regexp"
13
12
        "sort"
14
13
        "strconv"
15
14
        "strings"
26
25
        "launchpad.net/juju-core/errors"
27
26
        "launchpad.net/juju-core/instance"
28
27
        "launchpad.net/juju-core/log"
 
28
        "launchpad.net/juju-core/names"
29
29
        "launchpad.net/juju-core/state/api/params"
30
30
        "launchpad.net/juju-core/state/multiwatcher"
31
31
        "launchpad.net/juju-core/state/presence"
36
36
// TODO(niemeyer): This must not be exported.
37
37
type D []bson.DocElem
38
38
 
39
 
const serviceSnippet = "[a-z][a-z0-9]*(-[a-z0-9]*[a-z][a-z0-9]*)*"
40
 
const numberSnippet = "(0|[1-9][0-9]*)"
41
 
const containerSnippet = "(/[a-z]+/" + numberSnippet + ")"
42
 
const machineSnippet = numberSnippet + containerSnippet + "*"
43
 
const containerSpecSnippet = "(([a-z])*:)?"
44
 
 
45
 
var (
46
 
        validService               = regexp.MustCompile("^" + serviceSnippet + "$")
47
 
        validUnit                  = regexp.MustCompile("^" + serviceSnippet + "/" + numberSnippet + "$")
48
 
        validMachine               = regexp.MustCompile("^" + machineSnippet + "$")
49
 
        validMachineOrNewContainer = regexp.MustCompile("^" + containerSpecSnippet + machineSnippet + "$")
50
 
)
51
 
 
52
39
// BootstrapNonce is used as a nonce for the state server machine.
53
40
const BootstrapNonce = "user-admin:bootstrap"
54
41
 
55
 
// IsServiceName returns whether name is a valid service name.
56
 
func IsServiceName(name string) bool {
57
 
        return validService.MatchString(name)
58
 
}
59
 
 
60
 
// IsUnitName returns whether name is a valid unit name.
61
 
func IsUnitName(name string) bool {
62
 
        return validUnit.MatchString(name)
63
 
}
64
 
 
65
 
// IsMachineId returns whether id is a valid machine id.
66
 
func IsMachineId(id string) bool {
67
 
        return validMachine.MatchString(id)
68
 
}
69
 
 
70
 
// IsMachineOrNewContainer returns whether spec is a valid machine id or new container definition.
71
 
func IsMachineOrNewContainer(spec string) bool {
72
 
        return validMachineOrNewContainer.MatchString(spec)
73
 
}
74
 
 
75
42
// State represents the state of an environment
76
43
// managed by juju.
77
44
type State struct {
603
570
                return nil, fmt.Errorf("invalid entity tag %q", tag)
604
571
        }
605
572
        prefix, id := tag[0:i], tag[i+1:]
 
573
        prefix += "-"
606
574
        switch prefix {
607
 
        case "machine":
608
 
                id = MachineIdFromTag(tag)
609
 
                if !IsMachineId(id) {
 
575
        case names.MachineTagPrefix:
 
576
                id, err := names.MachineIdFromTag(tag)
 
577
                if err != nil {
 
578
                        return nil, err
 
579
                }
 
580
                if !names.IsMachineId(id) {
610
581
                        return nil, fmt.Errorf("invalid entity tag %q", tag)
611
582
                }
612
583
                return st.Machine(id)
613
 
        case "unit":
 
584
        case names.UnitTagPrefix:
614
585
                i := strings.LastIndex(id, "-")
615
586
                if i == -1 {
616
587
                        return nil, fmt.Errorf("invalid entity tag %q", tag)
617
588
                }
618
589
                name := id[:i] + "/" + id[i+1:]
619
 
                if !IsUnitName(name) {
 
590
                if !names.IsUnitName(name) {
620
591
                        return nil, fmt.Errorf("invalid entity tag %q", tag)
621
592
                }
622
593
                return st.Unit(name)
623
 
        case "user":
 
594
        case names.UserTagPrefix:
624
595
                return st.User(id)
625
 
        case "service":
626
 
                if !IsServiceName(id) {
 
596
        case names.ServiceTagPrefix:
 
597
                if !names.IsServiceName(id) {
627
598
                        return nil, fmt.Errorf("invalid entity tag %q", tag)
628
599
                }
629
600
                return st.Service(id)
630
 
        case "environment":
 
601
        case names.EnvironTagPrefix:
631
602
                conf, err := st.EnvironConfig()
632
603
                if err != nil {
633
604
                        return nil, err
651
622
        }
652
623
        id := parts[1]
653
624
        var coll string
654
 
        switch parts[0] {
655
 
        case "machine":
 
625
        tagPrefix := parts[0] + "-"
 
626
        switch tagPrefix {
 
627
        case names.MachineTagPrefix:
656
628
                coll = st.machines.Name
657
 
        case "service":
 
629
        case names.ServiceTagPrefix:
658
630
                coll = st.services.Name
659
 
        case "unit":
 
631
        case names.UnitTagPrefix:
660
632
                coll = st.units.Name
661
633
                // Handle replacements occurring when an entity name is created
662
634
                // for a unit.
665
637
                        return "", "", fmt.Errorf("invalid entity name %q", tag)
666
638
                }
667
639
                id = id[:idx] + "/" + id[idx+1:]
668
 
        case "user":
 
640
        case names.UserTagPrefix:
669
641
                coll = st.users.Name
670
642
        default:
671
643
                return "", "", fmt.Errorf("invalid entity name %q", tag)
743
715
func (st *State) AddService(name string, ch *Charm) (service *Service, err error) {
744
716
        defer utils.ErrorContextf(&err, "cannot add service %q", name)
745
717
        // Sanity checks.
746
 
        if !IsServiceName(name) {
 
718
        if !names.IsServiceName(name) {
747
719
                return nil, fmt.Errorf("invalid name")
748
720
        }
749
721
        if ch == nil {
803
775
 
804
776
// Service returns a service state by name.
805
777
func (st *State) Service(name string) (service *Service, err error) {
806
 
        if !IsServiceName(name) {
 
778
        if !names.IsServiceName(name) {
807
779
                return nil, fmt.Errorf("%q is not a valid service name", name)
808
780
        }
809
781
        sdoc := &serviceDoc{}
1075
1047
 
1076
1048
// Unit returns a unit by name.
1077
1049
func (st *State) Unit(name string) (*Unit, error) {
1078
 
        if !IsUnitName(name) {
 
1050
        if !names.IsUnitName(name) {
1079
1051
                return nil, fmt.Errorf("%q is not a valid unit name", name)
1080
1052
        }
1081
1053
        doc := unitDoc{}
1332
1304
}
1333
1305
 
1334
1306
var tagPrefix = map[byte]string{
1335
 
        'm': machineTagPrefix,
1336
 
        's': "service-",
1337
 
        'u': unitTagPrefix,
1338
 
        'e': "environment-",
 
1307
        'm': names.MachineTagPrefix,
 
1308
        's': names.ServiceTagPrefix,
 
1309
        'u': names.UnitTagPrefix,
 
1310
        'e': names.EnvironTagPrefix,
1339
1311
}
1340
1312
 
1341
1313
func tagForGlobalKey(key string) (string, bool) {