| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- // Copyright 2019 Yunion
- //
- // 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 fsutils
- import (
- "encoding/json"
- "fmt"
- "yunion.io/x/pkg/errors"
- "yunion.io/x/onecloud/pkg/util/procutils"
- )
- func VgActive(vgname string) error {
- out, err := procutils.NewCommand("vgchange", "-ay", vgname).Output()
- if err != nil {
- return errors.Wrapf(err, "vgchange -ay %s %s", vgname, out)
- }
- return nil
- }
- func (d *SFsutilDriver) ExtendLv(lvPath string) error {
- out, err := d.Exec("lvextend", "-l", "+100%FREE", lvPath)
- if err != nil {
- return errors.Wrapf(err, "extend lv %s failed %s", lvPath, out)
- }
- return nil
- }
- type LvProps struct {
- LvName string
- LvPath string
- }
- type LvNames struct {
- Report []struct {
- LV []struct {
- LVName string `json:"lv_name"`
- LVPath string `json:"lv_path"`
- } `json:"lv"`
- } `json:"report"`
- }
- func (d *SFsutilDriver) GetVgLvs(vg string) ([]LvProps, error) {
- cmd := fmt.Sprintf("lvs --reportformat json -o lv_name,lv_path %s 2>/dev/null", vg)
- out, err := d.Exec("sh", "-c", cmd)
- if err != nil {
- return nil, errors.Wrap(err, "find vg lvs")
- }
- var res LvNames
- err = json.Unmarshal(out, &res)
- if err != nil {
- return nil, errors.Wrap(err, "unmarshal lvs")
- }
- if len(res.Report) != 1 {
- return nil, errors.Errorf("unexpect res %v", res)
- }
- lvs := make([]LvProps, 0, len(res.Report[0].LV))
- for i := 0; i < len(res.Report[0].LV); i++ {
- if res.Report[0].LV[i].LVName == "" {
- continue
- }
- lvs = append(lvs, LvProps{res.Report[0].LV[i].LVName, res.Report[0].LV[i].LVPath})
- }
- return lvs, nil
- }
- type VgProps struct {
- VgName string
- VgUuid string
- }
- type VgReports struct {
- Report []struct {
- VG []struct {
- VgName string `json:"vg_name"`
- VgUuid string `json:"vg_uuid"`
- } `json:"vg"`
- } `json:"report"`
- }
- func FindVg(partDev string) (*VgProps, error) {
- cmd := fmt.Sprintf("vgs --reportformat json -o vg_name,vg_uuid --devices %s 2>/dev/null", partDev)
- out, err := procutils.NewCommand("sh", "-c", cmd).Output()
- if err != nil {
- return nil, errors.Wrap(err, "find vg lvs")
- }
- var vgReports VgReports
- err = json.Unmarshal(out, &vgReports)
- if err != nil {
- return nil, errors.Wrapf(err, "unmarshal vgprops %s", out)
- }
- if len(vgReports.Report) == 1 && len(vgReports.Report[0].VG) == 1 {
- var vgProps VgProps
- vgProps.VgName = vgReports.Report[0].VG[0].VgName
- vgProps.VgUuid = vgReports.Report[0].VG[0].VgUuid
- return &vgProps, nil
- }
- return nil, nil
- }
|