108 lines
3.6 KiB
Go
108 lines
3.6 KiB
Go
/*
|
|
Copyright 2017 The go-marathon Authors All rights reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package marathon
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// PodState defines the state of a pod
|
|
type PodState string
|
|
|
|
const (
|
|
// PodStateDegraded is a degraded pod
|
|
PodStateDegraded PodState = "DEGRADED"
|
|
|
|
// PodStateStable is a stable pod
|
|
PodStateStable PodState = "STABLE"
|
|
|
|
// PodStateTerminal is a terminal pod
|
|
PodStateTerminal PodState = "TERMINAL"
|
|
)
|
|
|
|
// PodStatus describes the pod status
|
|
type PodStatus struct {
|
|
ID string `json:"id,omitempty"`
|
|
Spec *Pod `json:"spec,omitempty"`
|
|
Status PodState `json:"status,omitempty"`
|
|
StatusSince string `json:"statusSince,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
Instances []*PodInstanceStatus `json:"instances,omitempty"`
|
|
TerminationHistory []*PodTerminationHistory `json:"terminationHistory,omitempty"`
|
|
LastUpdated string `json:"lastUpdated,omitempty"`
|
|
LastChanged string `json:"lastChanged,omitempty"`
|
|
}
|
|
|
|
// PodTerminationHistory is the termination history of the pod
|
|
type PodTerminationHistory struct {
|
|
InstanceID string `json:"instanceId,omitempty"`
|
|
StartedAt string `json:"startedAt,omitempty"`
|
|
TerminatedAt string `json:"terminatedAt,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
Containers []*ContainerTerminationHistory `json:"containers,omitempty"`
|
|
}
|
|
|
|
// ContainerTerminationHistory is the termination history of a container in a pod
|
|
type ContainerTerminationHistory struct {
|
|
ContainerID string `json:"containerId,omitempty"`
|
|
LastKnownState string `json:"lastKnownState,omitempty"`
|
|
Termination *ContainerTerminationState `json:"termination,omitempty"`
|
|
}
|
|
|
|
// PodStatus retrieves the pod configuration from marathon
|
|
func (r *marathonClient) PodStatus(name string) (*PodStatus, error) {
|
|
var podStatus PodStatus
|
|
|
|
if err := r.apiGet(buildPodStatusURI(name), nil, &podStatus); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &podStatus, nil
|
|
}
|
|
|
|
// PodStatuses retrieves all pod configuration from marathon
|
|
func (r *marathonClient) PodStatuses() ([]*PodStatus, error) {
|
|
var podStatuses []*PodStatus
|
|
|
|
if err := r.apiGet(buildPodStatusURI(""), nil, &podStatuses); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return podStatuses, nil
|
|
}
|
|
|
|
// WaitOnPod blocks until a pod to be deployed
|
|
func (r *marathonClient) WaitOnPod(name string, timeout time.Duration) error {
|
|
return r.wait(name, timeout, r.PodIsRunning)
|
|
}
|
|
|
|
// PodIsRunning returns whether the pod is stably running
|
|
func (r *marathonClient) PodIsRunning(name string) bool {
|
|
podStatus, err := r.PodStatus(name)
|
|
if apiErr, ok := err.(*APIError); ok && apiErr.ErrCode == ErrCodeNotFound {
|
|
return false
|
|
}
|
|
if err == nil && podStatus.Status == PodStateStable {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func buildPodStatusURI(path string) string {
|
|
return fmt.Sprintf("%s/%s::status", marathonAPIPods, trimRootPath(path))
|
|
}
|