github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/resource/resourceadapters/state.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package resourceadapters
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"gopkg.in/juju/charm.v6-unstable"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/resource"
    14  	"github.com/juju/juju/resource/state"
    15  	corestate "github.com/juju/juju/state"
    16  )
    17  
    18  type service struct {
    19  	*corestate.Application
    20  }
    21  
    22  // ID returns the application's tag.
    23  func (s *service) ID() names.ApplicationTag {
    24  	return names.NewApplicationTag(s.Name())
    25  }
    26  
    27  // CharmURL implements resource/workers.Service.
    28  func (s *service) CharmURL() *charm.URL {
    29  	cURL, _ := s.Application.CharmURL()
    30  	return cURL
    31  }
    32  
    33  // rawState is a wrapper around state.State that supports the needs
    34  // of resources.
    35  type rawState struct {
    36  	base    *corestate.State
    37  	persist corestate.Persistence
    38  }
    39  
    40  // NewResourceState is a function that may be passed to
    41  // state.SetResourcesComponent().
    42  func NewResourceState(persist corestate.Persistence, base *corestate.State) corestate.Resources {
    43  	return state.NewState(&rawState{
    44  		base:    base,
    45  		persist: persist,
    46  	})
    47  }
    48  
    49  // Persistence implements resource/state.RawState.
    50  func (st rawState) Persistence() state.Persistence {
    51  	persist := corestate.NewResourcePersistence(st.persist)
    52  	return resourcePersistence{persist}
    53  }
    54  
    55  // Storage implements resource/state.RawState.
    56  func (st rawState) Storage() state.Storage {
    57  	return st.persist.NewStorage()
    58  }
    59  
    60  // Units returns the tags for all units in the application.
    61  func (st rawState) Units(applicationID string) (tags []names.UnitTag, err error) {
    62  	svc, err := st.base.Application(applicationID)
    63  	if err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  	units, err := svc.AllUnits()
    67  	if err != nil {
    68  		return nil, errors.Trace(err)
    69  	}
    70  	for _, u := range units {
    71  		tags = append(tags, u.UnitTag())
    72  	}
    73  	return tags, nil
    74  }
    75  
    76  // VerifyService implements resource/state.RawState.
    77  func (st rawState) VerifyService(id string) error {
    78  	svc, err := st.base.Application(id)
    79  	if err != nil {
    80  		return errors.Trace(err)
    81  	}
    82  	if svc.Life() != corestate.Alive {
    83  		return errors.NewNotFound(nil, fmt.Sprintf("application %q dying or dead", id))
    84  	}
    85  	return nil
    86  }
    87  
    88  type resourcePersistence struct {
    89  	*corestate.ResourcePersistence
    90  }
    91  
    92  // StageResource implements state.resourcePersistence.
    93  func (p resourcePersistence) StageResource(res resource.Resource, storagePath string) (state.StagedResource, error) {
    94  	return p.ResourcePersistence.StageResource(res, storagePath)
    95  }
    96  
    97  // NewResourcePersistence is a function that may be passed to
    98  // state.SetResourcesPersistence(). It will be used in the core state
    99  // package to produce the resource persistence.
   100  func NewResourcePersistence(persist corestate.Persistence) corestate.ResourcesPersistence {
   101  	return corestate.NewResourcePersistence(persist)
   102  }
   103  
   104  // CleanUpBlob is a cleanup handler that will be used in state cleanup.
   105  func CleanUpBlob(st *corestate.State, persist corestate.Persistence, storagePath string) error {
   106  	// TODO(ericsnow) Move this to state.RemoveResource().
   107  	storage := persist.NewStorage()
   108  	return storage.Remove(storagePath)
   109  }