Add spec to v2.0 API.

This commit is contained in:
Rohit Jnagal 2015-02-19 17:59:41 +00:00
parent 7201af3ca5
commit 28984d7811
2 changed files with 47 additions and 11 deletions

View File

@ -29,6 +29,7 @@ const (
machineApi = "machine"
dockerApi = "docker"
summaryApi = "summary"
specApi = "spec"
)
// Interface for a cAdvisor API version
@ -257,6 +258,14 @@ func (self *version2_0) HandleRequest(requestType string, request []string, m ma
}
return writeResult(stats, w)
case specApi:
containerName := getContainerName(request)
glog.V(2).Infof("Api - Spec(%v)", containerName)
spec, err := m.GetContainerSpec(containerName)
if err != nil {
return err
}
return writeResult(spec, w)
default:
return self.baseVersion.HandleRequest(requestType, request, m, w, r)
}

View File

@ -58,6 +58,9 @@ type Manager interface {
// Gets information about a specific Docker container. The specified name is within the Docker namespace.
DockerContainer(dockerName string, query *info.ContainerInfoRequest) (info.ContainerInfo, error)
// Gets spec for a container.
GetContainerSpec(containerName string) (info.ContainerSpec, error)
// Get derived stats for a container.
GetContainerDerivedStats(containerName string) (info.DerivedStats, error)
@ -226,8 +229,7 @@ func (self *manager) globalHousekeeping(quit chan error) {
}
}
// Get a container by name.
func (self *manager) GetContainerInfo(containerName string, query *info.ContainerInfoRequest) (*info.ContainerInfo, error) {
func (self *manager) getContainerData(containerName string) (*containerData, error) {
var cont *containerData
var ok bool
func() {
@ -242,7 +244,40 @@ func (self *manager) GetContainerInfo(containerName string, query *info.Containe
if !ok {
return nil, fmt.Errorf("unknown container %q", containerName)
}
return cont, nil
}
func (self *manager) GetContainerSpec(containerName string) (info.ContainerSpec, error) {
cont, err := self.getContainerData(containerName)
if err != nil {
return info.ContainerSpec{}, err
}
cinfo, err := cont.GetInfo()
if err != nil {
return info.ContainerSpec{}, err
}
return self.getAdjustedSpec(cinfo), nil
}
func (self *manager) getAdjustedSpec(cinfo *containerInfo) info.ContainerSpec {
spec := cinfo.Spec
// Set default value to an actual value
if spec.HasMemory {
// Memory.Limit is 0 means there's no limit
if spec.Memory.Limit == 0 {
spec.Memory.Limit = uint64(self.machineInfo.MemoryCapacity)
}
}
return spec
}
// Get a container by name.
func (self *manager) GetContainerInfo(containerName string, query *info.ContainerInfoRequest) (*info.ContainerInfo, error) {
cont, err := self.getContainerData(containerName)
if err != nil {
return nil, err
}
return self.containerDataToContainerInfo(cont, query)
}
@ -262,17 +297,9 @@ func (self *manager) containerDataToContainerInfo(cont *containerData, query *in
ret := &info.ContainerInfo{
ContainerReference: cinfo.ContainerReference,
Subcontainers: cinfo.Subcontainers,
Spec: cinfo.Spec,
Spec: self.getAdjustedSpec(cinfo),
Stats: stats,
}
// Set default value to an actual value
if ret.Spec.HasMemory {
// Memory.Limit is 0 means there's no limit
if ret.Spec.Memory.Limit == 0 {
ret.Spec.Memory.Limit = uint64(self.machineInfo.MemoryCapacity)
}
}
return ret, nil
}