mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-27 15:30:23 +00:00
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
|
/*
|
||
|
Copyright 2016 The Kubernetes Authors.
|
||
|
|
||
|
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 volume
|
||
|
|
||
|
import (
|
||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||
|
"k8s.io/kubernetes/pkg/volume/util/fs"
|
||
|
)
|
||
|
|
||
|
var _ MetricsProvider = &metricsStatFS{}
|
||
|
|
||
|
// metricsStatFS represents a MetricsProvider that calculates the used and available
|
||
|
// Volume space by stat'ing and gathering filesystem info for the Volume path.
|
||
|
type metricsStatFS struct {
|
||
|
// the directory path the volume is mounted to.
|
||
|
path string
|
||
|
}
|
||
|
|
||
|
// NewMetricsStatfs creates a new metricsStatFS with the Volume path.
|
||
|
func NewMetricsStatFS(path string) MetricsProvider {
|
||
|
return &metricsStatFS{path}
|
||
|
}
|
||
|
|
||
|
// See MetricsProvider.GetMetrics
|
||
|
// GetMetrics calculates the volume usage and device free space by executing "du"
|
||
|
// and gathering filesystem info for the Volume path.
|
||
|
func (md *metricsStatFS) GetMetrics() (*Metrics, error) {
|
||
|
metrics := &Metrics{Time: metav1.Now()}
|
||
|
if md.path == "" {
|
||
|
return metrics, NewNoPathDefinedError()
|
||
|
}
|
||
|
|
||
|
err := md.getFsInfo(metrics)
|
||
|
if err != nil {
|
||
|
return metrics, err
|
||
|
}
|
||
|
|
||
|
return metrics, nil
|
||
|
}
|
||
|
|
||
|
// getFsInfo writes metrics.Capacity, metrics.Used and metrics.Available from the filesystem info
|
||
|
func (md *metricsStatFS) getFsInfo(metrics *Metrics) error {
|
||
|
available, capacity, usage, inodes, inodesFree, inodesUsed, err := fs.FsInfo(md.path)
|
||
|
if err != nil {
|
||
|
return NewFsInfoFailedError(err)
|
||
|
}
|
||
|
metrics.Available = resource.NewQuantity(available, resource.BinarySI)
|
||
|
metrics.Capacity = resource.NewQuantity(capacity, resource.BinarySI)
|
||
|
metrics.Used = resource.NewQuantity(usage, resource.BinarySI)
|
||
|
metrics.Inodes = resource.NewQuantity(inodes, resource.BinarySI)
|
||
|
metrics.InodesFree = resource.NewQuantity(inodesFree, resource.BinarySI)
|
||
|
metrics.InodesUsed = resource.NewQuantity(inodesUsed, resource.BinarySI)
|
||
|
return nil
|
||
|
}
|