diff --git a/Gopkg.lock b/Gopkg.lock index 3f05cbfc65..a1b81d3ba7 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1312,11 +1312,11 @@ [[projects]] branch = "master" - digest = "1:cdf0f619f0b3e37a792fb7f124bf2881d8a18cc13d693454b9731a8fa4f5fedc" + digest = "1:a2346cf0c965791c281a428a3e9bf522913941028e4c814a774af7f3cc2360b0" name = "yunion.io/x/jsonutils" packages = ["."] pruneopts = "UT" - revision = "f5b4a20f593f1f49039455fe40cb1274de53ac3f" + revision = "814e036849815935e5957ebd03bd0f4fc992fe83" [[projects]] branch = "master" @@ -1331,7 +1331,7 @@ [[projects]] branch = "master" - digest = "1:8c4d781aafefb667511de3e0e9fe02170519f63d75a69e34045bd417f25d5523" + digest = "1:5d9a659bf3c1d341cdf4135eca0009dbfa64a6728b3e0535c06afb6a76189a98" name = "yunion.io/x/pkg" packages = [ "gotypes", @@ -1364,7 +1364,7 @@ "utils", ] pruneopts = "UT" - revision = "883ea57a4b57d551bbf2fb7d1876d6ab9355c486" + revision = "cecf301871b09e94abaf1ff76d5ae7ac51ce0746" [[projects]] branch = "master" diff --git a/pkg/cloudcommon/policy/token.go b/pkg/cloudcommon/policy/token.go index c42b846bf4..5cb7cfd55b 100644 --- a/pkg/cloudcommon/policy/token.go +++ b/pkg/cloudcommon/policy/token.go @@ -1,9 +1,8 @@ package policy import ( - "time" + "yunion.io/x/log" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/gotypes" "yunion.io/x/onecloud/pkg/cloudcommon/consts" @@ -12,123 +11,34 @@ import ( ) type SPolicyTokenCredential struct { - Token mcclient.TokenCredential -} - -func (self *SPolicyTokenCredential) String() string { - return self.Token.String() -} - -func (self *SPolicyTokenCredential) IsZero() bool { - return self.Token.IsZero() -} - -func (self *SPolicyTokenCredential) GetProjectId() string { - return self.Token.GetProjectId() -} - -func (self *SPolicyTokenCredential) GetTenantId() string { - return self.Token.GetTenantId() -} - -func (self *SPolicyTokenCredential) GetUserId() string { - return self.Token.GetUserId() -} - -func (self *SPolicyTokenCredential) GetServiceURL(service, region, zone, endpointType string) (string, error) { - return self.Token.GetServiceURL(service, region, zone, endpointType) -} - -func (self *SPolicyTokenCredential) GetServiceURLs(service, region, zone, endpointType string) ([]string, error) { - return self.Token.GetServiceURLs(service, region, zone, endpointType) -} - -func (self *SPolicyTokenCredential) GetTokenString() string { - return self.Token.GetTokenString() -} - -func (self *SPolicyTokenCredential) GetDomainId() string { - return self.Token.GetDomainId() -} - -func (self *SPolicyTokenCredential) GetDomainName() string { - return self.Token.GetDomainName() -} - -func (self *SPolicyTokenCredential) GetTenantName() string { - return self.Token.GetTenantName() -} - -func (self *SPolicyTokenCredential) GetProjectName() string { - return self.Token.GetProjectName() -} - -func (self *SPolicyTokenCredential) GetUserName() string { - return self.Token.GetUserName() -} - -func (self *SPolicyTokenCredential) GetRoles() []string { - return self.Token.GetRoles() -} - -func (self *SPolicyTokenCredential) GetExpires() time.Time { - return self.Token.GetExpires() -} - -func (self *SPolicyTokenCredential) IsValid() bool { - return self.Token.IsValid() -} - -func (self *SPolicyTokenCredential) ValidDuration() time.Duration { - return self.Token.ValidDuration() -} - -func (self *SPolicyTokenCredential) GetRegions() []string { - return self.Token.GetRegions() -} - -func (self *SPolicyTokenCredential) GetServiceCatalog() mcclient.IServiceCatalog { - return self.Token.GetServiceCatalog() -} - -func (self *SPolicyTokenCredential) GetCatalogData(serviceTypes []string, region string) jsonutils.JSONObject { - return self.Token.GetCatalogData(serviceTypes, region) -} - -func (self *SPolicyTokenCredential) GetInternalServices(region string) []string { - return self.Token.GetInternalServices(region) -} - -func (self *SPolicyTokenCredential) GetExternalServices(region string) []mcclient.ExternalService { - return self.Token.GetExternalServices(region) -} - -func (self *SPolicyTokenCredential) GetEndpoints(region string, endpointType string) []mcclient.Endpoint { - return self.Token.GetEndpoints(region, endpointType) -} - -func (self *SPolicyTokenCredential) ToJson() jsonutils.JSONObject { - return self.Token.ToJson() + // usage embedded interface + mcclient.TokenCredential } func (self *SPolicyTokenCredential) HasSystemAdminPrivelege() bool { if consts.IsRbacEnabled() { - return PolicyManager.IsAdminCapable(self.Token) + return PolicyManager.IsAdminCapable(self.TokenCredential) } - return self.Token.HasSystemAdminPrivelege() + return self.TokenCredential.HasSystemAdminPrivelege() } func (self *SPolicyTokenCredential) IsAdminAllow(service string, resource string, action string, extra ...string) bool { if consts.IsRbacEnabled() { - result := PolicyManager.Allow(true, self.Token, service, resource, action, extra...) + result := PolicyManager.Allow(true, self.TokenCredential, service, resource, action, extra...) return result == rbacutils.AdminAllow } - return self.Token.IsAdminAllow(service, resource, action, extra...) + return self.TokenCredential.IsAdminAllow(service, resource, action, extra...) } func init() { - gotypes.RegisterSerializable(mcclient.TokenCredentialType, func() gotypes.ISerializable { - return &SPolicyTokenCredential{} + gotypes.RegisterSerializableTransformer(mcclient.TokenCredentialType, func(input gotypes.ISerializable) gotypes.ISerializable { + log.Debugf("do TokenCredential transform for %#v", input) + switch val := input.(type) { + case *mcclient.SSimpleToken: + return &SPolicyTokenCredential{val} + default: + return val + } }) } @@ -140,6 +50,6 @@ func FilterPolicyCredential(token mcclient.TokenCredential) mcclient.TokenCreden case *SPolicyTokenCredential: return token default: - return &SPolicyTokenCredential{Token: token} + return &SPolicyTokenCredential{TokenCredential: token} } } diff --git a/vendor/yunion.io/x/jsonutils/marshal.go b/vendor/yunion.io/x/jsonutils/marshal.go index fb99c077ec..97630bb987 100644 --- a/vendor/yunion.io/x/jsonutils/marshal.go +++ b/vendor/yunion.io/x/jsonutils/marshal.go @@ -134,8 +134,31 @@ func struct2JSONPairs(val reflect.Value) []JSONPair { if !gotypes.IsFieldExportable(fieldType.Name) { // unexportable field, ignore continue } - if fieldType.Type.Kind() == reflect.Struct && fieldType.Anonymous { // embbed struct - newPairs := struct2JSONPairs(val.Field(i)) + if fieldType.Anonymous { + nextVal := val.Field(i) + switch fieldType.Type.Kind() { + case reflect.Struct: // embbed struct + nextVal = val.Field(i) + case reflect.Interface: // embbed interface + CHECKINTERFACE: + for { + switch nextVal.Type().Kind() { + case reflect.Interface: + nextVal = nextVal.Elem() + case reflect.Ptr: + nextVal = reflect.Indirect(nextVal) + case reflect.Struct: + break CHECKINTERFACE + default: + log.Warningf("embeded interface point to a non struct data %s", nextVal.Type()) + break CHECKINTERFACE + } + } + default: + log.Warningf("unsupport anonymous embeded type %s", fieldType.Type.Name()) + continue + } + newPairs := struct2JSONPairs(nextVal) objPairs = append(objPairs, newPairs...) } else { jsonInfo := parseJsonMarshalInfo(fieldType.Tag) diff --git a/vendor/yunion.io/x/jsonutils/reflect.go b/vendor/yunion.io/x/jsonutils/reflect.go index d19df92fae..eab866e8dc 100644 --- a/vendor/yunion.io/x/jsonutils/reflect.go +++ b/vendor/yunion.io/x/jsonutils/reflect.go @@ -66,5 +66,6 @@ func JSONDeserialize(objType reflect.Type, strVal string) (gotypes.ISerializable if err != nil { return nil, err } + objPtr = gotypes.Transform(objType, objPtr) return objPtr, nil } diff --git a/vendor/yunion.io/x/pkg/gotypes/serialize.go b/vendor/yunion.io/x/pkg/gotypes/serialize.go index fdbc271497..ae601e6310 100644 --- a/vendor/yunion.io/x/pkg/gotypes/serialize.go +++ b/vendor/yunion.io/x/pkg/gotypes/serialize.go @@ -14,10 +14,13 @@ type ISerializable interface { type FuncSerializableAllocator func() ISerializable +type FuncSerializableTransformer func(ISerializable) ISerializable + var ( - ISerializableType = reflect.TypeOf((*ISerializable)(nil)).Elem() - serializableAllocators = map[reflect.Type]FuncSerializableAllocator{} - ErrTypeNotSerializable = errors.New("Type not serializable") + ISerializableType = reflect.TypeOf((*ISerializable)(nil)).Elem() + serializableAllocators = map[reflect.Type]FuncSerializableAllocator{} + serializableTransformers = map[reflect.Type][]FuncSerializableTransformer{} + ErrTypeNotSerializable = errors.New("Type not serializable") ) // RegisterSerializable registers an allocator func for the specified serializable type. @@ -29,17 +32,41 @@ func RegisterSerializable(valType reflect.Type, alloc FuncSerializableAllocator) if !IsSerializable(valType) { panic(valType.String() + " does not implement ISerializable") } + if _, ok := serializableAllocators[valType]; ok { + panic(valType.String() + " has been registered, might need to register a transformer") + } serializableAllocators[valType] = alloc } +func RegisterSerializableTransformer(valType reflect.Type, trans FuncSerializableTransformer) { + if !IsSerializable(valType) { + panic(valType.String() + " does not implement ISerializable") + } + if _, ok := serializableTransformers[valType]; !ok { + serializableTransformers[valType] = make([]FuncSerializableTransformer, 0) + } + serializableTransformers[valType] = append(serializableTransformers[valType], trans) +} + func IsSerializable(valType reflect.Type) bool { return valType.Implements(ISerializableType) } func NewSerializable(objType reflect.Type) (ISerializable, error) { deserFunc, ok := serializableAllocators[objType] - if ok { - return deserFunc(), nil + if !ok { + return nil, ErrTypeNotSerializable } - return nil, ErrTypeNotSerializable + retVal := deserFunc() + return retVal, nil +} + +func Transform(objType reflect.Type, retVal ISerializable) ISerializable { + transFuncs, ok := serializableTransformers[objType] + if ok { + for i := 0; i < len(transFuncs); i += 1 { + retVal = transFuncs[i](retVal) + } + } + return retVal } diff --git a/vendor/yunion.io/x/pkg/util/secrules/secrules.go b/vendor/yunion.io/x/pkg/util/secrules/secrules.go index 037bb62d45..6437ff1ae9 100644 --- a/vendor/yunion.io/x/pkg/util/secrules/secrules.go +++ b/vendor/yunion.io/x/pkg/util/secrules/secrules.go @@ -127,21 +127,12 @@ func ParseSecurityRule(pattern string) (*SecurityRule, error) { return nil, ErrInvalidAction } } else if status == SEG_IP { - // NOTE regutils.MatchCIDR actually also matches IP address without prefix length if regutils.MatchCIDR(seg) { - if idx := strings.Index(seg, "/"); idx > -1 { - if _, ipnet, err := net.ParseCIDR(seg); err != nil { - return nil, ErrInvalidNet - } else { - rule.IPNet = ipnet - } - } else if ip := net.ParseIP(seg); ip != nil { - rule.IPNet = &net.IPNet{ - IP: ip, - Mask: net.CIDRMask(32, 32), - } - } else { - return nil, ErrInvalidIPAddr + _, rule.IPNet, _ = net.ParseCIDR(seg) + } else if regutils.MatchIPAddr(seg) { + rule.IPNet = &net.IPNet{ + IP: net.ParseIP(seg), + Mask: net.CIDRMask(32, 32), } } else { rule.IPNet = &net.IPNet{ diff --git a/vendor/yunion.io/x/pkg/utils/profiler.go b/vendor/yunion.io/x/pkg/utils/profiler.go new file mode 100644 index 0000000000..35064e43c5 --- /dev/null +++ b/vendor/yunion.io/x/pkg/utils/profiler.go @@ -0,0 +1,10 @@ +package utils + +import ( + "io" + "runtime/pprof" +) + +func DumpAllGoroutineStack(w io.Writer) { + pprof.Lookup("goroutine").WriteTo(w, 1) +}