github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/model/host_manipulation.go (about)

     1  package model
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/evergreen-ci/evergreen"
     7  	"github.com/evergreen-ci/evergreen/cloud/providers/static"
     8  	"github.com/evergreen-ci/evergreen/model/distro"
     9  	"github.com/evergreen-ci/evergreen/model/host"
    10  	"github.com/evergreen-ci/evergreen/model/task"
    11  	"github.com/evergreen-ci/evergreen/util"
    12  	"github.com/mitchellh/mapstructure"
    13  	"github.com/pkg/errors"
    14  )
    15  
    16  // TODO(MCI-2245):
    17  //	This is a temporary package for storing host-related interactions that involve multiple models.
    18  
    19  // NextTaskForHost the next task that should be run on the host.
    20  func NextTaskForHost(h *host.Host) (*task.Task, error) {
    21  	taskQueue, err := FindTaskQueueForDistro(h.Distro.Id)
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  
    26  	if taskQueue == nil || taskQueue.IsEmpty() {
    27  		return nil, nil
    28  	}
    29  
    30  	nextTaskId := taskQueue.Queue[0].Id
    31  	fullTask, err := task.FindOne(task.ById(nextTaskId))
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  
    36  	return fullTask, nil
    37  }
    38  
    39  func UpdateStaticHosts(e *evergreen.Settings) error {
    40  	distros, err := distro.Find(distro.ByProvider(static.ProviderName))
    41  	if err != nil {
    42  		return err
    43  	}
    44  	activeStaticHosts := make([]string, 0)
    45  	settings := &static.Settings{}
    46  
    47  	for _, d := range distros {
    48  		err = mapstructure.Decode(d.ProviderSettings, settings)
    49  		if err != nil {
    50  			return errors.Errorf("invalid static settings for '%v'", d.Id)
    51  		}
    52  		for _, h := range settings.Hosts {
    53  			hostInfo, err := util.ParseSSHInfo(h.Name)
    54  			if err != nil {
    55  				return err
    56  			}
    57  			user := hostInfo.User
    58  			if user == "" {
    59  				user = d.User
    60  			}
    61  			staticHost := host.Host{
    62  				Id:           h.Name,
    63  				User:         user,
    64  				Host:         h.Name,
    65  				Distro:       d,
    66  				CreationTime: time.Now(),
    67  				Provider:     evergreen.HostTypeStatic,
    68  				StartedBy:    evergreen.User,
    69  				Status:       evergreen.HostRunning,
    70  				Provisioned:  true,
    71  			}
    72  
    73  			// upsert the host
    74  			_, err = staticHost.Upsert()
    75  			if err != nil {
    76  				return err
    77  			}
    78  			activeStaticHosts = append(activeStaticHosts, h.Name)
    79  		}
    80  	}
    81  	return host.DecommissionInactiveStaticHosts(activeStaticHosts)
    82  }