本文整理汇总了Golang中github.com/juju/errors.Annotate函数的典型用法代码示例。如果您正苦于以下问题:Golang Annotate函数的具体用法?Golang Annotate怎么用?Golang Annotate使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Annotate函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ProvisioningScript
// ProvisioningScript generates a bash script that can be
// executed on a remote host to carry out the cloud-init
// configuration.
func ProvisioningScript(mcfg *cloudinit.MachineConfig) (string, error) {
cloudcfg := coreCloudinit.New()
cloudcfg.SetAptUpdate(mcfg.EnableOSRefreshUpdate)
cloudcfg.SetAptUpgrade(mcfg.EnableOSUpgrade)
udata, err := cloudinit.NewUserdataConfig(mcfg, cloudcfg)
if err != nil {
return "", errors.Annotate(err, "error generating cloud-config")
}
if err := udata.ConfigureJuju(); err != nil {
return "", errors.Annotate(err, "error generating cloud-config")
}
configScript, err := sshinit.ConfigureScript(cloudcfg)
if err != nil {
return "", errors.Annotate(err, "error converting cloud-config to script")
}
var buf bytes.Buffer
// Always remove the cloud-init-output.log file first, if it exists.
fmt.Fprintf(&buf, "rm -f %s\n", utils.ShQuote(mcfg.CloudInitOutputLog))
// If something goes wrong, dump cloud-init-output.log to stderr.
buf.WriteString(shell.DumpFileOnErrorScript(mcfg.CloudInitOutputLog))
buf.WriteString(configScript)
return buf.String(), nil
}
示例2: migrationFromQuery
func (st *State) migrationFromQuery(query mongo.Query) (ModelMigration, error) {
var doc modelMigDoc
err := query.One(&doc)
if err == mgo.ErrNotFound {
return nil, errors.NotFoundf("migration")
} else if err != nil {
return nil, errors.Annotate(err, "migration lookup failed")
}
statusColl, closer := st.getCollection(migrationsStatusC)
defer closer()
var statusDoc modelMigStatusDoc
err = statusColl.FindId(doc.Id).One(&statusDoc)
if err == mgo.ErrNotFound {
return nil, errors.NotFoundf("migration status")
} else if err != nil {
return nil, errors.Annotate(err, "migration status lookup failed")
}
return &modelMigration{
doc: doc,
statusDoc: statusDoc,
st: st,
}, nil
}
示例3: AddEnvironmentUser
// AddEnvironmentUser adds a new user to the database.
func (st *State) AddEnvironmentUser(user, createdBy names.UserTag, displayName string) (*EnvironmentUser, error) {
// Ensure local user exists in state before adding them as an environment user.
if user.IsLocal() {
localUser, err := st.User(user)
if err != nil {
return nil, errors.Annotate(err, fmt.Sprintf("user %q does not exist locally", user.Name()))
}
if displayName == "" {
displayName = localUser.DisplayName()
}
}
// Ensure local createdBy user exists.
if createdBy.IsLocal() {
if _, err := st.User(createdBy); err != nil {
return nil, errors.Annotate(err, fmt.Sprintf("createdBy user %q does not exist locally", createdBy.Name()))
}
}
envuuid := st.EnvironUUID()
op, doc := createEnvUserOpAndDoc(envuuid, user, createdBy, displayName)
err := st.runTransaction([]txn.Op{op})
if err == txn.ErrAborted {
err = errors.AlreadyExistsf("environment user %q", user.Username())
}
if err != nil {
return nil, errors.Trace(err)
}
return &EnvironmentUser{st: st, doc: *doc}, nil
}
示例4: addUUIDToSecurityGroupNames
func addUUIDToSecurityGroupNames(e *Environ) error {
nova := e.nova()
groups, err := nova.ListSecurityGroups()
if err != nil {
return errors.Annotate(err, "upgrading instance names")
}
cfg := e.Config()
eName := cfg.Name()
eUUID, ok := cfg.UUID()
if !ok {
return errors.NotFoundf("model uuid for model %q", eName)
}
for _, group := range groups {
newName, ok, err := replaceNameWithID(group.Name, eName, eUUID)
if err != nil {
return errors.Annotate(err, "generating the new security group name")
}
if !ok {
continue
}
// Name should have uuid instead of name
_, err = nova.UpdateSecurityGroup(group.Id, newName, group.Description)
if err != nil {
return errors.Annotatef(err, "upgrading security group name from %q to %q", group.Name, newName)
}
}
return nil
}
示例5: populateGUIArchive
// populateGUIArchive stores the uploaded Juju GUI archive in provider storage,
// updates the GUI metadata and set the current Juju GUI version.
func (c *BootstrapCommand) populateGUIArchive(st *state.State, env environs.Environ) error {
agentConfig := c.CurrentConfig()
dataDir := agentConfig.DataDir()
guistorage, err := st.GUIStorage()
if err != nil {
return errors.Trace(err)
}
defer guistorage.Close()
gui, err := agenttools.ReadGUIArchive(dataDir)
if err != nil {
return errors.Annotate(err, "cannot fetch GUI info")
}
f, err := os.Open(filepath.Join(agenttools.SharedGUIDir(dataDir), "gui.tar.bz2"))
if err != nil {
return errors.Annotate(err, "cannot read GUI archive")
}
defer f.Close()
if err := guistorage.Add(f, binarystorage.Metadata{
Version: gui.Version.String(),
Size: gui.Size,
SHA256: gui.SHA256,
}); err != nil {
return errors.Annotate(err, "cannot store GUI archive")
}
if err = st.GUISetVersion(gui.Version); err != nil {
return errors.Annotate(err, "cannot set current GUI version")
}
return nil
}
示例6: UpdateCloudCredential
// UpdateCloudCredential adds or updates a cloud credential with the given tag.
func (st *State) UpdateCloudCredential(tag names.CloudCredentialTag, credential cloud.Credential) error {
credentials := map[names.CloudCredentialTag]cloud.Credential{tag: credential}
buildTxn := func(attempt int) ([]txn.Op, error) {
cloudName := tag.Cloud().Id()
cloud, err := st.Cloud(cloudName)
if err != nil {
return nil, errors.Trace(err)
}
ops, err := validateCloudCredentials(cloud, cloudName, credentials)
if err != nil {
return nil, errors.Annotate(err, "validating cloud credentials")
}
_, err = st.CloudCredential(tag)
if err != nil && !errors.IsNotFound(err) {
return nil, errors.Maskf(err, "fetching cloud credentials")
}
if err == nil {
ops = append(ops, updateCloudCredentialOp(tag, credential))
} else {
ops = append(ops, createCloudCredentialOp(tag, credential))
}
return ops, nil
}
if err := st.run(buildTxn); err != nil {
return errors.Annotate(err, "updating cloud credentials")
}
return nil
}
示例7: Destroy
// Destroy sets the environment's lifecycle to Dying, preventing
// addition of services or machines to state.
func (e *Environment) Destroy() (err error) {
defer errors.DeferredAnnotatef(&err, "failed to destroy environment")
if e.Life() != Alive {
return nil
}
if err := e.ensureDestroyable(); err != nil {
return errors.Trace(err)
}
if err := e.startDestroy(); err != nil {
if abortErr := e.abortDestroy(); abortErr != nil {
return errors.Annotate(abortErr, err.Error())
}
return errors.Trace(err)
}
// Check that no new environments or machines were added between the first
// check and the Environment.startDestroy().
if err := e.ensureDestroyable(); err != nil {
if abortErr := e.abortDestroy(); abortErr != nil {
return errors.Annotate(abortErr, err.Error())
}
return errors.Trace(err)
}
if err := e.finishDestroy(); err != nil {
if abortErr := e.abortDestroy(); abortErr != nil {
return errors.Annotate(abortErr, err.Error())
}
return errors.Trace(err)
}
return nil
}
示例8: processGet
// processGet handles a tools GET request.
func (h *toolsDownloadHandler) processGet(r *http.Request, st *state.State) ([]byte, error) {
version, err := version.ParseBinary(r.URL.Query().Get(":version"))
if err != nil {
return nil, errors.Annotate(err, "error parsing version")
}
storage, err := st.ToolsStorage()
if err != nil {
return nil, errors.Annotate(err, "error getting tools storage")
}
defer storage.Close()
_, reader, err := storage.Open(version.String())
if errors.IsNotFound(err) {
// Tools could not be found in tools storage,
// so look for them in simplestreams, fetch
// them and cache in tools storage.
logger.Infof("%v tools not found locally, fetching", version)
reader, err = h.fetchAndCacheTools(version, storage, st)
if err != nil {
err = errors.Annotate(err, "error fetching tools")
}
}
if err != nil {
return nil, err
}
defer reader.Close()
data, err := ioutil.ReadAll(reader)
if err != nil {
return nil, errors.Annotate(err, "failed to read tools tarball")
}
return data, nil
}
示例9: WatchStorageAttachment
// WatchStorageAttachment returns a state.NotifyWatcher that reacts to changes
// to the VolumeAttachmentInfo or FilesystemAttachmentInfo corresponding to the tags
// specified.
func WatchStorageAttachment(
st StorageInterface,
storageTag names.StorageTag,
machineTag names.MachineTag,
unitTag names.UnitTag,
) (state.NotifyWatcher, error) {
storageInstance, err := st.StorageInstance(storageTag)
if err != nil {
return nil, errors.Annotate(err, "getting storage instance")
}
var w state.NotifyWatcher
switch storageInstance.Kind() {
case state.StorageKindBlock:
volume, err := st.StorageInstanceVolume(storageTag)
if err != nil {
return nil, errors.Annotate(err, "getting storage volume")
}
w = st.WatchVolumeAttachment(machineTag, volume.VolumeTag())
case state.StorageKindFilesystem:
filesystem, err := st.StorageInstanceFilesystem(storageTag)
if err != nil {
return nil, errors.Annotate(err, "getting storage filesystem")
}
w = st.WatchFilesystemAttachment(machineTag, filesystem.FilesystemTag())
default:
return nil, errors.Errorf("invalid storage kind %v", storageInstance.Kind())
}
w2 := st.WatchStorageAttachment(storageTag, unitTag)
return common.NewMultiNotifyWatcher(w, w2), nil
}
示例10: dialLogsinkAPI
func dialLogsinkAPI(apiInfo *api.Info) (*websocket.Conn, error) {
// TODO(mjs) Most of this should be extracted to be shared for
// connections to both /log (debuglog) and /logsink.
header := utils.BasicAuthHeader(apiInfo.Tag.String(), apiInfo.Password)
header.Set("X-Juju-Nonce", apiInfo.Nonce)
conn, err := api.Connect(apiInfo, "/logsink", header, api.DialOpts{})
if err != nil {
return nil, errors.Annotate(err, "failed to connect to logsink API")
}
// Read the initial error and translate to a real error.
// Read up to the first new line character. We can't use bufio here as it
// reads too much from the reader.
line := make([]byte, 4096)
n, err := conn.Read(line)
if err != nil {
return nil, errors.Annotate(err, "unable to read initial response")
}
line = line[0:n]
var errResult params.ErrorResult
err = json.Unmarshal(line, &errResult)
if err != nil {
return nil, errors.Annotate(err, "unable to unmarshal initial response")
}
if errResult.Error != nil {
return nil, errors.Annotatef(err, "initial server error")
}
return conn, nil
}
示例11: cleanupDyingMachineResources
func cleanupDyingMachineResources(m *Machine) error {
volumeAttachments, err := m.st.MachineVolumeAttachments(m.MachineTag())
if err != nil {
return errors.Annotate(err, "getting machine volume attachments")
}
for _, va := range volumeAttachments {
if err := m.st.DetachVolume(va.Machine(), va.Volume()); err != nil {
if IsContainsFilesystem(err) {
// The volume will be destroyed when the
// contained filesystem is removed, whose
// destruction is initiated below.
continue
}
return errors.Trace(err)
}
}
filesystemAttachments, err := m.st.MachineFilesystemAttachments(m.MachineTag())
if err != nil {
return errors.Annotate(err, "getting machine filesystem attachments")
}
for _, fsa := range filesystemAttachments {
if err := m.st.DetachFilesystem(fsa.Machine(), fsa.Filesystem()); err != nil {
return errors.Trace(err)
}
}
return nil
}
示例12: New
// New starts a logsender worker which reads log message structs from
// a channel and sends them to the JES via the logsink API.
func New(logs chan *LogRecord, apiInfo *api.Info) worker.Worker {
loop := func(stop <-chan struct{}) error {
logger.Debugf("starting logsender worker")
conn, err := dialLogsinkAPI(apiInfo)
if err != nil {
return errors.Annotate(err, "logsender dial failed")
}
defer conn.Close()
for {
select {
case rec := <-logs:
err := websocket.JSON.Send(conn, &apiserver.LogMessage{
Time: rec.Time,
Module: rec.Module,
Location: rec.Location,
Level: rec.Level,
Message: rec.Message,
})
if err != nil {
// Note: due to the fire-and-forget nature of the
// logsink API, it is possible that when the
// connection dies, any logs that were "in-flight"
// will not be recorded on the server side.
return errors.Annotate(err, "logsink connection failed")
}
case <-stop:
return nil
}
}
}
return worker.NewSimpleWorker(loop)
}
示例13: startFunc
// startFunc returns a StartFunc that creates a worker based on the manifolds
// named in the supplied config.
func startFunc(config ManifoldConfig) dependency.StartFunc {
return func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
// Get dependencies and open a connection.
var a agent.Agent
if err := getResource(config.AgentName, &a); err != nil {
return nil, err
}
conn, err := openConnection(a)
if err != nil {
return nil, errors.Annotate(err, "cannot open api")
}
// Add the environment uuid to agent config if not present.
currentConfig := a.CurrentConfig()
if currentConfig.Environment().Id() == "" {
err := a.ChangeConfig(func(setter agent.ConfigSetter) error {
environTag, err := conn.EnvironTag()
if err != nil {
return errors.Annotate(err, "no environment uuid set on api")
}
return setter.Migrate(agent.MigrateParams{
Environment: environTag,
})
})
if err != nil {
logger.Warningf("unable to save environment uuid: %v", err)
// Not really fatal, just annoying.
}
}
// Return the worker.
return newApiConnWorker(conn)
}
}
示例14: restoreBootstrapMachine
func restoreBootstrapMachine(st api.Connection, backupFile string, agentConf agentConfig) (addr string, err error) {
client := st.Client()
addr, err = client.PublicAddress("0")
if err != nil {
return "", errors.Annotate(err, "cannot get public address of bootstrap machine")
}
paddr, err := client.PrivateAddress("0")
if err != nil {
return "", errors.Annotate(err, "cannot get private address of bootstrap machine")
}
status, err := client.Status(nil)
if err != nil {
return "", errors.Annotate(err, "cannot get environment status")
}
info, ok := status.Machines["0"]
if !ok {
return "", fmt.Errorf("cannot find bootstrap machine in status")
}
newInstId := instance.Id(info.InstanceId)
progress("copying backup file to bootstrap host")
if err := sendViaScp(backupFile, addr, "~/juju-backup.tgz"); err != nil {
return "", errors.Annotate(err, "cannot copy backup file to bootstrap instance")
}
progress("updating bootstrap machine")
if err := runViaSsh(addr, updateBootstrapMachineScript(newInstId, agentConf, addr, paddr)); err != nil {
return "", errors.Annotate(err, "update script failed")
}
return addr, nil
}
示例15: StoreCharmArchive
// StoreCharmArchive stores a charm archive in environment storage.
func StoreCharmArchive(st *state.State, curl *charm.URL, ch charm.Charm, r io.Reader, size int64, sha256 string) error {
storage := newStateStorage(st.EnvironUUID(), st.MongoSession())
storagePath, err := charmArchiveStoragePath(curl)
if err != nil {
return errors.Annotate(err, "cannot generate charm archive name")
}
if err := storage.Put(storagePath, r, size); err != nil {
return errors.Annotate(err, "cannot add charm to storage")
}
// Now update the charm data in state and mark it as no longer pending.
_, err = st.UpdateUploadedCharm(ch, curl, storagePath, sha256)
if err != nil {
alreadyUploaded := err == state.ErrCharmRevisionAlreadyModified ||
errors.Cause(err) == state.ErrCharmRevisionAlreadyModified ||
state.IsCharmAlreadyUploadedError(err)
if err := storage.Remove(storagePath); err != nil {
if alreadyUploaded {
logger.Errorf("cannot remove duplicated charm archive from storage: %v", err)
} else {
logger.Errorf("cannot remove unsuccessfully recorded charm archive from storage: %v", err)
}
}
if alreadyUploaded {
// Somebody else managed to upload and update the charm in
// state before us. This is not an error.
return nil
}
}
return nil
}