func (suite *StateSuite) TestRemoveStateInstancesPartial(c *gc.C) { storage := suite.newStorage(c) state := common.BootstrapState{ StateInstances: []instance.Id{ instance.Id("a"), instance.Id("b"), instance.Id("c"), }, } err := common.SaveState(storage, &state) c.Assert(err, jc.ErrorIsNil) err = common.RemoveStateInstances( storage, state.StateInstances[0], instance.Id("not-there"), state.StateInstances[2], ) c.Assert(err, jc.ErrorIsNil) storedState, err := common.LoadState(storage) c.Assert(storedState, gc.DeepEquals, &common.BootstrapState{ StateInstances: []instance.Id{ state.StateInstances[1], }, }) }
func (suite *StateSuite) TestRemoveStateInstancesNoProviderState(c *gc.C) { storage := suite.newStorage(c) err := common.RemoveStateInstances(storage, instance.Id("id")) // No error if the id is missing, so no error if the entire // provider-state file is missing. This is the case if // bootstrap failed. c.Assert(err, jc.ErrorIsNil) }
func (suite *StateSuite) TestRemoveStateInstancesNone(c *gc.C) { storage := suite.newStorage(c) state := common.BootstrapState{ StateInstances: []instance.Id{instance.Id("an-instance-id")}, } err := common.SaveState(storage, &state) c.Assert(err, jc.ErrorIsNil) err = common.RemoveStateInstances( storage, instance.Id("not-there"), ) c.Assert(err, jc.ErrorIsNil) storedState, err := common.LoadState(storage) c.Assert(storedState, gc.DeepEquals, &state) }
func (env *joyentEnviron) StopInstances(ids ...instance.Id) error { // Remove all the instances in parallel so that we incur less round-trips. var wg sync.WaitGroup //var err error wg.Add(len(ids)) errc := make(chan error, len(ids)) for _, id := range ids { id := id // copy to new free var for closure go func() { defer wg.Done() if err := env.stopInstance(string(id)); err != nil { errc <- err } }() } wg.Wait() select { case err := <-errc: return errors.Annotate(err, "cannot stop all instances") default: } return common.RemoveStateInstances(env.Storage(), ids...) }