github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/common/modelstatus.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/names.v2"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	"github.com/juju/juju/apiserver/params"
    12  )
    13  
    14  // ModelStatusAPI provides common client-side API functions
    15  // to call into apiserver.common.ModelStatusAPI.
    16  type ModelStatusAPI struct {
    17  	facade base.FacadeCaller
    18  }
    19  
    20  // NewModelStatusAPI creates a ModelStatusAPI on the specified facade,
    21  // and uses this name when calling through the caller.
    22  func NewModelStatusAPI(facade base.FacadeCaller) *ModelStatusAPI {
    23  	return &ModelStatusAPI{facade}
    24  }
    25  
    26  // ModelStatus returns a status summary for each model tag passed in.
    27  func (c *ModelStatusAPI) ModelStatus(tags ...names.ModelTag) ([]base.ModelStatus, error) {
    28  	result := params.ModelStatusResults{}
    29  	models := make([]params.Entity, len(tags))
    30  	for i, tag := range tags {
    31  		models[i] = params.Entity{Tag: tag.String()}
    32  	}
    33  	req := params.Entities{
    34  		Entities: models,
    35  	}
    36  	if err := c.facade.FacadeCall("ModelStatus", req, &result); err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	return c.processModelStatusResults(result.Results)
    41  }
    42  
    43  func (c *ModelStatusAPI) processModelStatusResults(rs []params.ModelStatus) ([]base.ModelStatus, error) {
    44  	results := make([]base.ModelStatus, len(rs))
    45  	for i, r := range rs {
    46  		if r.Error != nil {
    47  			// cope with typed error
    48  			results[i].Error = errors.Trace(r.Error)
    49  			continue
    50  		}
    51  		model, err := names.ParseModelTag(r.ModelTag)
    52  		if err != nil {
    53  			results[i].Error = errors.Trace(err)
    54  			continue
    55  		}
    56  		owner, err := names.ParseUserTag(r.OwnerTag)
    57  		if err != nil {
    58  			results[i].Error = errors.Trace(err)
    59  			continue
    60  		}
    61  		results[i] = constructModelStatus(model, owner, r)
    62  	}
    63  	return results, nil
    64  }
    65  
    66  func constructModelStatus(model names.ModelTag, owner names.UserTag, r params.ModelStatus) base.ModelStatus {
    67  	volumes := make([]base.Volume, len(r.Volumes))
    68  	for i, in := range r.Volumes {
    69  		volumes[i] = base.Volume{
    70  			Id:         in.Id,
    71  			ProviderId: in.ProviderId,
    72  			Status:     in.Status,
    73  			Message:    in.Message,
    74  			Detachable: in.Detachable,
    75  		}
    76  	}
    77  
    78  	filesystems := make([]base.Filesystem, len(r.Filesystems))
    79  	for i, in := range r.Filesystems {
    80  		filesystems[i] = base.Filesystem{
    81  			Id:         in.Id,
    82  			ProviderId: in.ProviderId,
    83  			Status:     in.Status,
    84  			Message:    in.Message,
    85  			Detachable: in.Detachable,
    86  		}
    87  	}
    88  
    89  	result := base.ModelStatus{
    90  		UUID:               model.Id(),
    91  		Life:               string(r.Life),
    92  		Owner:              owner.Id(),
    93  		HostedMachineCount: r.HostedMachineCount,
    94  		ApplicationCount:   r.ApplicationCount,
    95  		TotalMachineCount:  len(r.Machines),
    96  		Volumes:            volumes,
    97  		Filesystems:        filesystems,
    98  	}
    99  	result.Machines = make([]base.Machine, len(r.Machines))
   100  	for j, mm := range r.Machines {
   101  		if mm.Hardware != nil && mm.Hardware.Cores != nil {
   102  			result.CoreCount += int(*mm.Hardware.Cores)
   103  		}
   104  		result.Machines[j] = base.Machine{
   105  			Id:          mm.Id,
   106  			InstanceId:  mm.InstanceId,
   107  			DisplayName: mm.DisplayName,
   108  			HasVote:     mm.HasVote,
   109  			WantsVote:   mm.WantsVote,
   110  			Status:      mm.Status,
   111  			Message:     mm.Message,
   112  		}
   113  	}
   114  	return result
   115  }