pulumi/pkg/resource/urn.go
joeduffy 7d19abc2a3 Print the current environment
This change implements showing a summary of the current environment.
All you need to do is run

    $ lumi env

and the current environment's information will be printed.

This makes it convenient to grab resource information that might be
required, for instance, to correlate with logs (e.g., lambda ARNs).

Eventually, as per pulumi/lumi#184, we want to print details about
all of the resources too.
2017-06-16 09:46:09 -07:00

88 lines
3.4 KiB
Go

// Licensed to Pulumi Corporation ("Pulumi") under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// Pulumi licenses this file to You 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 resource
import (
"strings"
"github.com/pulumi/lumi/pkg/tokens"
"github.com/pulumi/lumi/pkg/util/contract"
)
// URN is a friendly, but unique, URN for a resource, most often auto-assigned by Lumi. These are
// used as unique IDs for objects, and help us to perform graph diffing and resolution of resource objects.
//
// In theory, we could support manually assigned URIs in the future. For the time being, however, we have opted to
// simplify developers' lives by mostly automating the generation of them algorithmically. The one caveat where it
// isn't truly automatic is that a developer -- or resource provider -- must provide a semi-unique name part.
//
// Each resource URN is of the form:
//
// urn:lumi:<Namespace>::<AllocModule>::<Type>::<Name>
//
// wherein each element is the following:
//
// <Namespace> The namespace being deployed into
// <AllocModule> The module token in which the object was allocated
// <Type> The object type's full type token
// <Name> The human-friendly name identifier assigned by the developer or provider
//
// In the future, we may add elements to the URN; it is more important that it is unique than it is human-typable.
type URN string
const (
URNPrefix = "urn:" + URNNamespaceID + ":" // the standard URN prefix
URNNamespaceID = "lumi" // the URN namespace
URNNameDelimiter = "::" // the delimiter between URN name elements
)
// NewURN creates a unique resource URN for the given resource object.
func NewURN(ns tokens.QName, alloc tokens.Module, t tokens.Type, name tokens.QName) URN {
return URN(
URNPrefix +
string(ns) +
URNNameDelimiter + string(alloc) +
URNNameDelimiter + string(t) +
URNNameDelimiter + string(name),
)
}
// URNName returns the URN name part of a URN (i.e., strips off the prefix).
func (urn URN) URNName() string {
s := string(urn)
contract.Assert(strings.HasPrefix(s, URNPrefix))
return s[len(URNPrefix):]
}
// Namespace returns the resource namespace part of a URN.
func (urn URN) Namespace() tokens.QName {
return tokens.QName(strings.Split(urn.URNName(), URNNameDelimiter)[0])
}
// Alloc returns the resource allocation context part of a URN.
func (urn URN) Alloc() tokens.Module {
return tokens.Module(strings.Split(urn.URNName(), URNNameDelimiter)[1])
}
// Type returns the resource type part of a URN.
func (urn URN) Type() tokens.Type {
return tokens.Type(strings.Split(urn.URNName(), URNNameDelimiter)[2])
}
// Name returns the resource name part of a URN.
func (urn URN) Name() tokens.QName {
return tokens.QName(strings.Split(urn.URNName(), URNNameDelimiter)[3])
}