本文整理汇总了Golang中github.com/juju/errors.Annotatef函数的典型用法代码示例。如果您正苦于以下问题:Golang Annotatef函数的具体用法?Golang Annotatef怎么用?Golang Annotatef使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Annotatef函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: createFilesystemAttachments
// createFilesystemAttachments creates filesystem attachments with the specified parameters.
func createFilesystemAttachments(
ctx *context,
params []storage.FilesystemAttachmentParams,
) ([]storage.FilesystemAttachment, error) {
paramsBySource, filesystemSources, err := filesystemAttachmentParamsBySource(ctx, params)
if err != nil {
return nil, errors.Trace(err)
}
var allFilesystemAttachments []storage.FilesystemAttachment
for sourceName, params := range paramsBySource {
logger.Debugf("attaching filesystems: %v", params)
filesystemSource := filesystemSources[sourceName]
results, err := filesystemSource.AttachFilesystems(params)
if err != nil {
return nil, errors.Annotatef(err, "attaching filesystems from source %q", sourceName)
}
for i, result := range results {
if result.Error != nil {
return nil, errors.Annotatef(
err, "attaching %s to %s",
names.ReadableString(params[i].Filesystem),
names.ReadableString(params[i].Machine),
)
}
allFilesystemAttachments = append(allFilesystemAttachments, *result.FilesystemAttachment)
}
}
return allFilesystemAttachments, nil
}
开发者ID:mhilton,项目名称:juju,代码行数:30,代码来源:filesystems.go
示例2: do
func (w *collect) do() error {
logger.Tracef("recording metrics")
config := w.agent.CurrentConfig()
tag := config.Tag()
unitTag, ok := tag.(names.UnitTag)
if !ok {
return errors.Errorf("expected a unit tag, got %v", tag)
}
paths := uniter.NewWorkerPaths(config.DataDir(), unitTag, "metrics-collect")
recorder, err := newRecorder(unitTag, paths, w.unitCharmLookup, w.metricFactory)
if errors.Cause(err) == errMetricsNotDefined {
logger.Tracef("%v", err)
return nil
} else if err != nil {
return errors.Annotate(err, "failed to instantiate metric recorder")
}
ctx := newHookContext(unitTag.String(), recorder)
err = ctx.addJujuUnitsMetric()
if err != nil {
return errors.Annotatef(err, "error adding 'juju-units' metric")
}
r := runner.NewRunner(ctx, paths)
err = r.RunHook(string(hooks.CollectMetrics))
if err != nil {
return errors.Annotatef(err, "error running 'collect-metrics' hook")
}
return nil
}
开发者ID:imoapps,项目名称:juju,代码行数:32,代码来源:manifold.go
示例3: ModelDialer
func (ctxt *Context) ModelDialer(controller, model string) (*Dialer, error) {
if controller == "" {
c, err := ctxt.store.origStore.CurrentController()
if err != nil {
return nil, errors.Annotatef(err, "cannot get current controller")
}
controller = c
}
if model == "" {
m, err := ctxt.store.origStore.CurrentModel(controller)
if err != nil {
return nil, errors.Annotatef(err, "cannot get current model")
}
model = m
}
modelUUID := model
if !utils.IsValidUUIDString(model) {
md, err := ctxt.store.origStore.ModelByName(controller, model)
if err != nil {
return nil, errors.Annotatef(err, "cannot get model")
}
modelUUID = md.ModelUUID
}
return ctxt.dialer(controller, modelUUID)
}
开发者ID:rogpeppe,项目名称:misc,代码行数:25,代码来源:conn.go
示例4: PrivateAddress
// PrivateAddress implements the server side of Client.PrivateAddress.
func (c *Client) PrivateAddress(p params.PrivateAddress) (results params.PrivateAddressResults, err error) {
switch {
case names.IsValidMachine(p.Target):
machine, err := c.api.stateAccessor.Machine(p.Target)
if err != nil {
return results, err
}
addr, err := machine.PrivateAddress()
if err != nil {
return results, errors.Annotatef(err, "error fetching address for machine %q", machine)
}
return params.PrivateAddressResults{PrivateAddress: addr.Value}, nil
case names.IsValidUnit(p.Target):
unit, err := c.api.stateAccessor.Unit(p.Target)
if err != nil {
return results, err
}
addr, err := unit.PrivateAddress()
if err != nil {
return results, errors.Annotatef(err, "error fetching address for unit %q", unit)
}
return params.PrivateAddressResults{PrivateAddress: addr.Value}, nil
}
return results, fmt.Errorf("unknown unit or machine %q", p.Target)
}
开发者ID:imoapps,项目名称:juju,代码行数:28,代码来源:client.go
示例5: newDischargeRequiredError
func (m *ExternalMacaroonAuthenticator) newDischargeRequiredError(cause error) error {
if m.Service == nil || m.Macaroon == nil {
return errors.Trace(cause)
}
mac := m.Macaroon.Clone()
// TODO(fwereade): 2016-03-17 lp:1558657
expiryTime := time.Now().Add(externalLoginExpiryTime)
if err := addMacaroonTimeBeforeCaveat(m.Service, mac, expiryTime); err != nil {
return errors.Annotatef(err, "cannot create macaroon")
}
err := m.Service.AddCaveat(mac, checkers.NeedDeclaredCaveat(
checkers.Caveat{
Location: m.IdentityLocation,
Condition: "is-authenticated-user",
},
usernameKey,
))
if err != nil {
return errors.Annotatef(err, "cannot create macaroon")
}
return &common.DischargeRequiredError{
Cause: cause,
Macaroon: mac,
}
}
开发者ID:bac,项目名称:juju,代码行数:25,代码来源:user.go
示例6: AddDefaultBlockDevicesDocs
// AddDefaultBlockDevicesDocs creates block devices documents
// for all existing machines in all environments.
func AddDefaultBlockDevicesDocs(st *State) error {
environments, closer := st.getCollection(environmentsC)
defer closer()
var envDocs []bson.M
err := environments.Find(nil).Select(bson.M{"_id": 1}).All(&envDocs)
if err != nil {
return errors.Annotate(err, "failed to read environments")
}
for _, envDoc := range envDocs {
envUUID := envDoc["_id"].(string)
envSt, err := st.ForEnviron(names.NewEnvironTag(envUUID))
if err != nil {
return errors.Annotatef(err, "failed to open environment %q", envUUID)
}
defer envSt.Close()
machines, err := envSt.AllMachines()
if err != nil {
return errors.Annotatef(err, "failed to retrieve machines for environment %q", envUUID)
}
for _, machine := range machines {
// If a txn fails because the doc already exists, that's ok.
if err := envSt.runTransaction([]txn.Op{
createMachineBlockDevicesOp(machine.Id()),
}); err != nil && err != txn.ErrAborted {
return err
}
}
}
return nil
}
开发者ID:vonwenm,项目名称:juju,代码行数:36,代码来源:upgrades.go
示例7: ListServices
// ListServices lists all installed services on the running system
func ListServices() ([]string, error) {
initName, err := VersionInitSystem(series.HostSeries())
if err != nil {
return nil, errors.Trace(err)
}
switch initName {
case InitSystemWindows:
services, err := windows.ListServices()
if err != nil {
return nil, errors.Annotatef(err, "failed to list %s services", initName)
}
return services, nil
case InitSystemUpstart:
services, err := upstart.ListServices()
if err != nil {
return nil, errors.Annotatef(err, "failed to list %s services", initName)
}
return services, nil
case InitSystemSystemd:
services, err := systemd.ListServices()
if err != nil {
return nil, errors.Annotatef(err, "failed to list %s services", initName)
}
return services, nil
default:
return nil, errors.NotFoundf("init system %q", initName)
}
}
开发者ID:ktsakalozos,项目名称:juju,代码行数:30,代码来源:service.go
示例8: appCharmDecRefOps
// appCharmDecRefOps returns the operations necessary to delete a
// reference to a charm and its per-application settings and storage
// constraints document. If no references to a given (app, charm) pair
// remain, the operations returned will also remove the settings and
// storage constraints documents for that pair, and schedule a cleanup
// to see if the charm itself is now unreferenced and can be tidied
// away itself.
func appCharmDecRefOps(st modelBackend, appName string, curl *charm.URL) ([]txn.Op, error) {
refcounts, closer := st.getCollection(refcountsC)
defer closer()
charmKey := charmGlobalKey(curl)
charmOp, err := nsRefcounts.AliveDecRefOp(refcounts, charmKey)
if err != nil {
return nil, errors.Annotate(err, "charm reference")
}
settingsKey := applicationSettingsKey(appName, curl)
settingsOp, isFinal, err := nsRefcounts.DyingDecRefOp(refcounts, settingsKey)
if err != nil {
return nil, errors.Annotatef(err, "settings reference %s", settingsKey)
}
storageConstraintsKey := applicationStorageConstraintsKey(appName, curl)
storageConstraintsOp, _, err := nsRefcounts.DyingDecRefOp(refcounts, storageConstraintsKey)
if err != nil {
return nil, errors.Annotatef(err, "storage constraints reference %s", storageConstraintsKey)
}
ops := []txn.Op{settingsOp, storageConstraintsOp, charmOp}
if isFinal {
// XXX(fwereade): this construction, in common with ~all
// our refcount logic, is safe in parallel but not in
// serial. If this logic is used twice while composing a
// single transaction, the removal won't be triggered.
// see `Application.removeOps` for the workaround.
ops = append(ops, finalAppCharmRemoveOps(appName, curl)...)
}
return ops, nil
}
开发者ID:bac,项目名称:juju,代码行数:41,代码来源:charmref.go
示例9: obliterateUnit
// obliterateUnit removes a unit from state completely. It is not safe or
// sane to obliterate any unit in isolation; its only reasonable use is in
// the context of machine obliteration, in which we can be sure that unclean
// shutdown of units is not going to leave a machine in a difficult state.
func (st *State) obliterateUnit(unitName string) error {
unit, err := st.Unit(unitName)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
return err
}
// Unlike the machine, we *can* always destroy the unit, and (at least)
// prevent further dependencies being added. If we're really lucky, the
// unit will be removed immediately.
if err := unit.Destroy(); err != nil {
return errors.Annotatef(err, "cannot destroy unit %q", unitName)
}
if err := unit.Refresh(); errors.IsNotFound(err) {
return nil
} else if err != nil {
return err
}
// Destroy and remove all storage attachments for the unit.
if err := st.cleanupUnitStorageAttachments(unit.UnitTag(), true); err != nil {
return errors.Annotatef(err, "cannot destroy storage for unit %q", unitName)
}
for _, subName := range unit.SubordinateNames() {
if err := st.obliterateUnit(subName); err != nil {
return err
}
}
if err := unit.EnsureDead(); err != nil {
return err
}
return unit.Remove()
}
开发者ID:kat-co,项目名称:juju,代码行数:36,代码来源:cleanup.go
示例10: Handle
// Handle is part of the watcher.StringsHandler interface.
// It should give us any actions currently enqueued for this machine.
// We try to execute every action before returning
func (h *handler) Handle(_ <-chan struct{}, actionsSlice []string) error {
for _, actionId := range actionsSlice {
ok := names.IsValidAction(actionId)
if !ok {
return errors.Errorf("got invalid action id %s", actionId)
}
actionTag := names.NewActionTag(actionId)
action, err := h.config.Facade.Action(actionTag)
if err != nil {
return errors.Annotatef(err, "could not retrieve action %s", actionId)
}
err = h.config.Facade.ActionBegin(actionTag)
if err != nil {
return errors.Annotatef(err, "could not begin action %s", action.Name())
}
// We try to handle the action. The result returned from handling the action is
// sent through using ActionFinish. We only stop the loop if ActionFinish fails.
var finishErr error
results, err := h.config.HandleAction(action.Name(), action.Params())
if err != nil {
finishErr = h.config.Facade.ActionFinish(actionTag, params.ActionFailed, nil, err.Error())
} else {
finishErr = h.config.Facade.ActionFinish(actionTag, params.ActionCompleted, results, "")
}
if finishErr != nil {
return errors.Trace(finishErr)
}
}
return nil
}
开发者ID:bac,项目名称:juju,代码行数:36,代码来源:worker.go
示例11: Manifold
// Manifold returns a dependency.Manifold that runs a charm revision worker
// according to the supplied configuration.
func Manifold(config ManifoldConfig) dependency.Manifold {
return dependency.Manifold{
Inputs: []string{
config.APICallerName,
config.ClockName,
},
Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
var clock clock.Clock
if err := getResource(config.ClockName, &clock); err != nil {
return nil, errors.Trace(err)
}
var apiCaller base.APICaller
if err := getResource(config.APICallerName, &apiCaller); err != nil {
return nil, errors.Trace(err)
}
facade, err := config.NewFacade(apiCaller)
if err != nil {
return nil, errors.Annotatef(err, "cannot create facade")
}
worker, err := config.NewWorker(charmrevision.Config{
RevisionUpdater: facade,
Clock: clock,
Period: config.Period,
})
if err != nil {
return nil, errors.Annotatef(err, "cannot create worker")
}
return worker, nil
},
}
}
开发者ID:exekias,项目名称:juju,代码行数:34,代码来源:manifold.go
示例12: updateOps
// updateOps modifies the Insert and Update fields in a slice of
// txn.Ops to ensure they are multi-model safe where
// possible. The returned []txn.Op is a new copy of the input (with
// changes).
func (r *multiModelRunner) updateOps(ops []txn.Op) ([]txn.Op, error) {
var outOps []txn.Op
for _, op := range ops {
collInfo, found := r.schema[op.C]
if !found {
return nil, errors.Errorf("forbidden transaction: references unknown collection %q", op.C)
}
if collInfo.rawAccess {
return nil, errors.Errorf("forbidden transaction: references raw-access collection %q", op.C)
}
outOp := op
if !collInfo.global {
outOp.Id = ensureModelUUIDIfString(r.modelUUID, op.Id)
if op.Insert != nil {
newInsert, err := mungeDocForMultiEnv(op.Insert, r.modelUUID, modelUUIDRequired)
if err != nil {
return nil, errors.Annotatef(err, "cannot insert into %q", op.C)
}
outOp.Insert = newInsert
}
if op.Update != nil {
newUpdate, err := r.mungeUpdate(op.Update)
if err != nil {
return nil, errors.Annotatef(err, "cannot update %q", op.C)
}
outOp.Update = newUpdate
}
}
outOps = append(outOps, outOp)
}
logger.Tracef("rewrote transaction: %#v", outOps)
return outOps, nil
}
开发者ID:bac,项目名称:juju,代码行数:37,代码来源:txns.go
示例13: addDefaultBindingsToServices
func addDefaultBindingsToServices(st *State) error {
services, err := st.AllServices()
if err != nil {
return errors.Trace(err)
}
upgradesLogger.Debugf("adding default endpoint bindings to services (where missing)")
ops := make([]txn.Op, 0, len(services))
for _, service := range services {
ch, _, err := service.Charm()
if err != nil {
return errors.Annotatef(err, "cannot get charm for service %q", service.Name())
}
if _, err := service.EndpointBindings(); err == nil {
upgradesLogger.Debugf("service %q already has bindings (skipping)", service.Name())
continue
} else if !errors.IsNotFound(err) {
return errors.Annotatef(err, "checking service %q for existing bindings", service.Name())
}
// Passing nil for the bindings map will use the defaults.
createOp, err := createEndpointBindingsOp(st, service.globalKey(), nil, ch.Meta())
if err != nil {
return errors.Annotatef(err, "setting default endpoint bindings for service %q", service.Name())
}
ops = append(ops, createOp)
}
return st.runTransaction(ops)
}
开发者ID:AlexisBruemmer,项目名称:juju,代码行数:28,代码来源:upgrades.go
示例14: detachFilesystems
func detachFilesystems(ctx *context, attachments []storage.FilesystemAttachmentParams) error {
paramsBySource, filesystemSources, err := filesystemAttachmentParamsBySource(ctx, attachments)
if err != nil {
return errors.Trace(err)
}
for sourceName, params := range paramsBySource {
logger.Debugf("detaching filesystems: %v", params)
filesystemSource := filesystemSources[sourceName]
results, err := filesystemSource.DetachFilesystems(params)
if err != nil {
return errors.Annotatef(err, "detaching filesystems from source %q", sourceName)
}
for i, err := range results {
if err == nil {
continue
}
return errors.Annotatef(
err, "detaching %s from %s",
names.ReadableString(params[i].Filesystem),
names.ReadableString(params[i].Machine),
)
}
}
return nil
}
开发者ID:mhilton,项目名称:juju,代码行数:25,代码来源:filesystems.go
示例15: createContainer
func createContainer(
lxcContainer golxc.Container,
directory string,
networkConfig *container.NetworkConfig,
extraCreateArgs, templateParams []string,
caCert []byte,
) error {
// Generate initial lxc.conf with networking settings.
netConfig := generateNetworkConfig(networkConfig)
configPath := filepath.Join(directory, "lxc.conf")
if err := ioutil.WriteFile(configPath, []byte(netConfig), 0644); err != nil {
return errors.Annotatef(err, "failed to write container config %q", configPath)
}
logger.Tracef("wrote initial config %q for container %q", configPath, lxcContainer.Name())
var err error
var execEnv []string = nil
var closer func()
if caCert != nil {
execEnv, closer, err = wgetEnvironment(caCert)
if err != nil {
return errors.Annotatef(err, "failed to get environment for wget execution")
}
defer closer()
}
// Create the container.
logger.Debugf("creating lxc container %q", lxcContainer.Name())
logger.Debugf("lxc-create template params: %v", templateParams)
if err := lxcContainer.Create(configPath, defaultTemplate, extraCreateArgs, templateParams, execEnv); err != nil {
return errors.Annotatef(err, "lxc container creation failed")
}
return nil
}
开发者ID:claudiu-coblis,项目名称:juju,代码行数:34,代码来源:lxc.go
示例16: OpenPorts
// OpenPorts sends a request to the GCE API to open the provided port
// ranges on the named firewall. If the firewall does not exist yet it
// is created, with the provided port ranges opened. Otherwise the
// existing firewall is updated to add the provided port ranges to the
// ports it already has open. The call blocks until the ports are
// opened or the request fails.
func (gce Connection) OpenPorts(fwname string, ports ...network.PortRange) error {
// TODO(ericsnow) Short-circuit if ports is empty.
// Compose the full set of open ports.
currentPorts, err := gce.Ports(fwname)
if err != nil {
return errors.Trace(err)
}
inputPortsSet := network.NewPortSet(ports...)
if inputPortsSet.IsEmpty() {
return nil
}
currentPortsSet := network.NewPortSet(currentPorts...)
// Send the request, depending on the current ports.
if currentPortsSet.IsEmpty() {
// Create a new firewall.
firewall := firewallSpec(fwname, inputPortsSet)
if err := gce.raw.AddFirewall(gce.projectID, firewall); err != nil {
return errors.Annotatef(err, "opening port(s) %+v", ports)
}
return nil
}
// Update an existing firewall.
newPortsSet := currentPortsSet.Union(inputPortsSet)
firewall := firewallSpec(fwname, newPortsSet)
if err := gce.raw.UpdateFirewall(gce.projectID, fwname, firewall); err != nil {
return errors.Annotatef(err, "opening port(s) %+v", ports)
}
return nil
}
开发者ID:howbazaar,项目名称:juju,代码行数:38,代码来源:conn_network.go
示例17: AddLeadershipSettingsDocs
// AddLeadsershipSettingsDocs creates service leadership documents in
// the settings collection for all services in all environments.
func AddLeadershipSettingsDocs(st *State) error {
environments, closer := st.getCollection(environmentsC)
defer closer()
var envDocs []bson.M
err := environments.Find(nil).Select(bson.M{"_id": 1}).All(&envDocs)
if err != nil {
return errors.Annotate(err, "failed to read environments")
}
for _, envDoc := range envDocs {
envUUID := envDoc["_id"].(string)
envSt, err := st.ForEnviron(names.NewEnvironTag(envUUID))
if err != nil {
return errors.Annotatef(err, "failed to open environment %q", envUUID)
}
defer envSt.Close()
services, err := envSt.AllServices()
if err != nil {
return errors.Annotatef(err, "failed to retrieve services for environment %q", envUUID)
}
for _, service := range services {
// The error from this is intentionally ignored as the
// transaction will fail if the service already has a
// leadership settings doc.
envSt.runTransaction([]txn.Op{
addLeadershipSettingsOp(service.Name()),
})
}
}
return nil
}
开发者ID:vonwenm,项目名称:juju,代码行数:36,代码来源:upgrades.go
示例18: ClosePorts
// ClosePorts sends a request to the GCE API to close the provided port
// ranges on the named firewall. If the firewall does not exist nothing
// happens. If the firewall is left with no ports then it is removed.
// Otherwise it will be left with just the open ports it has that do not
// match the provided port ranges. The call blocks until the ports are
// closed or the request fails.
func (gce Connection) ClosePorts(fwname string, ports ...network.PortRange) error {
// Compose the full set of open ports.
currentPorts, err := gce.Ports(fwname)
if err != nil {
return errors.Trace(err)
}
inputPortsSet := network.NewPortSet(ports...)
if inputPortsSet.IsEmpty() {
return nil
}
currentPortsSet := network.NewPortSet(currentPorts...)
newPortsSet := currentPortsSet.Difference(inputPortsSet)
// Send the request, depending on the current ports.
if newPortsSet.IsEmpty() {
// Delete a firewall.
// TODO(ericsnow) Handle case where firewall does not exist.
if err := gce.raw.RemoveFirewall(gce.projectID, fwname); err != nil {
return errors.Annotatef(err, "closing port(s) %+v", ports)
}
return nil
}
// Update an existing firewall.
firewall := firewallSpec(fwname, newPortsSet)
if err := gce.raw.UpdateFirewall(gce.projectID, fwname, firewall); err != nil {
return errors.Annotatef(err, "closing port(s) %+v", ports)
}
return nil
}
开发者ID:howbazaar,项目名称:juju,代码行数:36,代码来源:conn_network.go
示例19: newService
func newService(name string, conf common.Conf, initSystem, series string) (Service, error) {
switch initSystem {
case InitSystemWindows:
svc, err := windows.NewService(name, conf)
if err != nil {
return nil, errors.Annotatef(err, "failed to wrap service %q", name)
}
return svc, nil
case InitSystemUpstart:
return upstart.NewService(name, conf), nil
case InitSystemSystemd:
dataDir, err := paths.DataDir(series)
if err != nil {
return nil, errors.Annotatef(err, "failed to find juju data dir for service %q", name)
}
svc, err := systemd.NewService(name, conf, dataDir)
if err != nil {
return nil, errors.Annotatef(err, "failed to wrap service %q", name)
}
return svc, nil
default:
return nil, errors.NotFoundf("init system %q", initSystem)
}
}
开发者ID:ktsakalozos,项目名称:juju,代码行数:25,代码来源:service.go
示例20: machineVolumeParams
// machineVolumeParams retrieves VolumeParams for the volumes that should be
// provisioned with, and attached to, the machine. The client should ignore
// parameters that it does not know how to handle.
func (p *ProvisionerAPI) machineVolumeParams(m *state.Machine) ([]params.VolumeParams, error) {
volumeAttachments, err := m.VolumeAttachments()
if err != nil {
return nil, err
}
if len(volumeAttachments) == 0 {
return nil, nil
}
envConfig, err := p.st.EnvironConfig()
if err != nil {
return nil, err
}
poolManager := poolmanager.New(state.NewStateSettings(p.st))
allVolumeParams := make([]params.VolumeParams, 0, len(volumeAttachments))
for _, volumeAttachment := range volumeAttachments {
volumeTag := volumeAttachment.Volume()
volume, err := p.st.Volume(volumeTag)
if err != nil {
return nil, errors.Annotatef(err, "getting volume %q", volumeTag.Id())
}
storageInstance, err := storagecommon.MaybeAssignedStorageInstance(
volume.StorageInstance, p.st.StorageInstance,
)
if err != nil {
return nil, errors.Annotatef(err, "getting volume %q storage instance", volumeTag.Id())
}
volumeParams, err := storagecommon.VolumeParams(volume, storageInstance, envConfig, poolManager)
if err != nil {
return nil, errors.Annotatef(err, "getting volume %q parameters", volumeTag.Id())
}
provider, err := registry.StorageProvider(storage.ProviderType(volumeParams.Provider))
if err != nil {
return nil, errors.Annotate(err, "getting storage provider")
}
if provider.Dynamic() {
// Leave dynamic storage to the storage provisioner.
continue
}
volumeAttachmentParams, ok := volumeAttachment.Params()
if !ok {
// Attachment is already provisioned; this is an insane
// state, so we should not proceed with the volume.
return nil, errors.Errorf(
"volume %s already attached to machine %s",
volumeTag.Id(), m.Id(),
)
}
// Not provisioned yet, so ask the cloud provisioner do it.
volumeParams.Attachment = ¶ms.VolumeAttachmentParams{
volumeTag.String(),
m.Tag().String(),
"", // we're creating the volume, so it has no volume ID.
"", // we're creating the machine, so it has no instance ID.
volumeParams.Provider,
volumeAttachmentParams.ReadOnly,
}
allVolumeParams = append(allVolumeParams, volumeParams)
}
return allVolumeParams, nil
}
开发者ID:kakamessi99,项目名称:juju,代码行数:63,代码来源:provisioner.go
注:本文中的github.com/juju/errors.Annotatef函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论