github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/cmd/juju/controller/listcontrollersconverters.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package controller
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	"github.com/juju/juju/cmd/juju/common"
    13  	"github.com/juju/juju/jujuclient"
    14  )
    15  
    16  // ControllerSet contains the set of controllers known to the client,
    17  // and name of the current controller.
    18  type ControllerSet struct {
    19  	Controllers       map[string]ControllerItem `yaml:"controllers" json:"controllers"`
    20  	CurrentController string                    `yaml:"current-controller" json:"current-controller"`
    21  }
    22  
    23  // ControllerMachines holds the total number of controller
    24  // machines and the number of active ones.
    25  type ControllerMachines struct {
    26  	Active int `yaml:"active"`
    27  	Total  int `yaml:"total"`
    28  }
    29  
    30  // ControllerItem defines the serialization behaviour of controller information.
    31  type ControllerItem struct {
    32  	ModelName          string              `yaml:"current-model,omitempty" json:"current-model,omitempty"`
    33  	User               string              `yaml:"user,omitempty" json:"user,omitempty"`
    34  	Access             string              `yaml:"access,omitempty" json:"access,omitempty"`
    35  	Server             string              `yaml:"recent-server,omitempty" json:"recent-server,omitempty"`
    36  	ControllerUUID     string              `yaml:"uuid" json:"uuid"`
    37  	APIEndpoints       []string            `yaml:"api-endpoints,flow" json:"api-endpoints"`
    38  	CACert             string              `yaml:"ca-cert" json:"ca-cert"`
    39  	Cloud              string              `yaml:"cloud" json:"cloud"`
    40  	CloudRegion        string              `yaml:"region,omitempty" json:"region,omitempty"`
    41  	AgentVersion       string              `yaml:"agent-version,omitempty" json:"agent-version,omitempty"`
    42  	ModelCount         *int                `yaml:"model-count,omitempty" json:"model-count,omitempty"`
    43  	MachineCount       *int                `yaml:"machine-count,omitempty" json:"machine-count,omitempty"`
    44  	ControllerMachines *ControllerMachines `yaml:"controller-machines,omitempty" json:"controller-machins,omitempty"`
    45  }
    46  
    47  // convertControllerDetails takes a map of Controllers and
    48  // the recently used model for each and creates a list of
    49  // amalgamated controller and model details.
    50  func (c *listControllersCommand) convertControllerDetails(storeControllers map[string]jujuclient.ControllerDetails) (map[string]ControllerItem, []string) {
    51  	if len(storeControllers) == 0 {
    52  		return nil, nil
    53  	}
    54  
    55  	errs := []string{}
    56  	addError := func(msg, controllerName string, err error) {
    57  		logger.Errorf(fmt.Sprintf("getting current %s for controller %s: %v", msg, controllerName, err))
    58  		errs = append(errs, msg)
    59  	}
    60  
    61  	controllers := map[string]ControllerItem{}
    62  	for controllerName, details := range storeControllers {
    63  		serverName := ""
    64  		// The most recently connected-to address
    65  		// is the first in the list.
    66  		if len(details.APIEndpoints) > 0 {
    67  			serverName = details.APIEndpoints[0]
    68  		}
    69  
    70  		var userName, access string
    71  		accountDetails, err := c.store.AccountDetails(controllerName)
    72  		if err != nil {
    73  			if !errors.IsNotFound(err) {
    74  				addError("account details", controllerName, err)
    75  				continue
    76  			}
    77  		} else {
    78  			userName = accountDetails.User
    79  			access = accountDetails.LastKnownAccess
    80  		}
    81  
    82  		var modelName string
    83  		currentModel, err := c.store.CurrentModel(controllerName)
    84  		if err != nil {
    85  			if !errors.IsNotFound(err) {
    86  				addError("model", controllerName, err)
    87  				continue
    88  			}
    89  		} else {
    90  			modelName = currentModel
    91  			if userName != "" {
    92  				// There's a user logged in, so display the
    93  				// model name relative to that user.
    94  				if unqualifiedModelName, owner, err := jujuclient.SplitModelName(modelName); err == nil {
    95  					user := names.NewUserTag(userName)
    96  					modelName = common.OwnerQualifiedModelName(unqualifiedModelName, owner, user)
    97  				}
    98  			}
    99  		}
   100  
   101  		item := ControllerItem{
   102  			ModelName:      modelName,
   103  			User:           userName,
   104  			Access:         access,
   105  			Server:         serverName,
   106  			APIEndpoints:   details.APIEndpoints,
   107  			ControllerUUID: details.ControllerUUID,
   108  			CACert:         details.CACert,
   109  			Cloud:          details.Cloud,
   110  			CloudRegion:    details.CloudRegion,
   111  			AgentVersion:   details.AgentVersion,
   112  		}
   113  		if details.MachineCount != nil && *details.MachineCount > 0 {
   114  			item.MachineCount = details.MachineCount
   115  		}
   116  		if details.ModelCount != nil && *details.ModelCount > 0 {
   117  			item.ModelCount = details.ModelCount
   118  		}
   119  		if details.ControllerMachineCount > 0 {
   120  			item.ControllerMachines = &ControllerMachines{
   121  				Total:  details.ControllerMachineCount,
   122  				Active: details.ActiveControllerMachineCount,
   123  			}
   124  		}
   125  		controllers[controllerName] = item
   126  	}
   127  	return controllers, errs
   128  }