mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
add fill struct method
This commit is contained in:
@@ -390,7 +390,8 @@ func (self *SRegion) GetInstances(zoneId string, ids []string, offset int, limit
|
||||
instances := []SInstance{}
|
||||
for _, reservation := range res.Reservations {
|
||||
for _, instance := range reservation.Instances {
|
||||
instanceType, err := self.GetInstanceType(StrVal(instance.InstanceType))
|
||||
FillZero(instance)
|
||||
instanceType, err := self.GetInstanceType(*instance.InstanceType)
|
||||
if err != nil {
|
||||
return nil, 0 , err
|
||||
}
|
||||
@@ -415,9 +416,9 @@ func (self *SRegion) GetInstances(zoneId string, ids []string, offset int, limit
|
||||
var networkInterfaces SNetworkInterfaces
|
||||
for _, n := range instance.NetworkInterfaces {
|
||||
i := SNetworkInterface{
|
||||
MacAddress: StrVal(n.MacAddress),
|
||||
NetworkInterfaceId: StrVal(n.NetworkInterfaceId),
|
||||
PrimaryIpAddress: StrVal(n.PrivateIpAddress),
|
||||
MacAddress: *n.MacAddress,
|
||||
NetworkInterfaceId: *n.NetworkInterfaceId,
|
||||
PrimaryIpAddress: *n.PrivateIpAddress,
|
||||
}
|
||||
networkInterfaces.NetworkInterface = append(networkInterfaces.NetworkInterface, i)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package aws
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"github.com/aws/aws-sdk-go/service/ec2"
|
||||
@@ -311,4 +312,41 @@ func YunionSecRuleToAws(rule secrules.SecurityRule) ([]ec2.IpPermission, error)
|
||||
}
|
||||
|
||||
return permissions, nil
|
||||
}
|
||||
|
||||
|
||||
// fill a pointer struct with zero value.
|
||||
func FillZero(i interface{}) error {
|
||||
V := reflect.Indirect(reflect.ValueOf(i))
|
||||
|
||||
if !V.CanSet() {
|
||||
return fmt.Errorf("input is not addressable: %#v", i)
|
||||
}
|
||||
|
||||
if V.Kind() != reflect.Struct {
|
||||
return fmt.Errorf("only accept struct type")
|
||||
}
|
||||
|
||||
for i := 0; i < V.NumField(); i++ {
|
||||
field := V.Field(i)
|
||||
|
||||
if field.Kind() == reflect.Ptr && field.IsNil() {
|
||||
if field.CanSet() {
|
||||
field.Set(reflect.New(field.Type().Elem()))
|
||||
}
|
||||
}
|
||||
|
||||
vField := reflect.Indirect(field)
|
||||
switch vField.Kind() {
|
||||
case reflect.Map:
|
||||
vField.Set(reflect.MakeMap(vField.Type()))
|
||||
case reflect.Struct:
|
||||
err := FillZero(field.Interface())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user