in pkg/plugins/resources/traditional/store.go [102:278]
func (t *traditionalStore) Create(ctx context.Context, resource core_model.Resource, fs ...store.CreateOptionsFunc) error {
var err error
opts := store.NewCreateOptions(fs...)
if opts.Name == core_model.DefaultMesh {
opts.Name += ".universal"
}
name, _, err := util_k8s.CoreNameToK8sName(opts.Name)
if err != nil {
return err
}
switch resource.Descriptor().Name {
case mesh.MappingType:
spec := resource.GetSpec()
mapping := spec.(*mesh_proto.Mapping)
appNames := mapping.ApplicationNames
serviceInterface := mapping.InterfaceName
for _, app := range appNames {
err = t.metadataReport.RegisterServiceAppMapping(serviceInterface, mappingGroup, app)
if err != nil {
return err
}
}
case mesh.MetaDataType:
spec := resource.GetSpec()
metadata := spec.(*mesh_proto.MetaData)
services := map[string]*info.ServiceInfo{}
// 把metadata赋值到services中
for key, serviceInfo := range metadata.GetServices() {
services[key] = &info.ServiceInfo{
Name: serviceInfo.GetName(),
Group: serviceInfo.GetGroup(),
Version: serviceInfo.GetVersion(),
Protocol: serviceInfo.GetProtocol(),
Path: serviceInfo.GetPath(),
Params: serviceInfo.GetParams(),
}
}
metadataInfo := &info.MetadataInfo{
App: metadata.GetApp(),
Revision: metadata.GetRevision(),
Services: services,
}
err = t.metadataReport.PublishAppMetadata(metadataInfo.App, metadataInfo.Revision, metadataInfo)
if err != nil {
return err
}
case mesh.DataplaneType:
// Dataplane无法Create, 只能Get和List
case mesh.TagRouteType:
labels := opts.Labels
base := mesh_proto.Base{
Application: labels[mesh_proto.Application],
Service: labels[mesh_proto.Service],
ID: labels[mesh_proto.ID],
ServiceVersion: labels[mesh_proto.ServiceVersion],
ServiceGroup: labels[mesh_proto.ServiceGroup],
}
key := mesh_proto.BuildServiceKey(base)
path := mesh_proto.GetRoutePath(key, consts.TagRoute)
bytes, err := core_model.ToYAML(resource.GetSpec())
if err != nil {
return fmt.Errorf("failed to marshal tag route to yaml %s", err.Error())
}
cfg, _ := t.governance.GetConfig(path)
if cfg != "" {
return fmt.Errorf("%s Config is exsited ", path)
}
err = t.governance.SetConfig(path, string(bytes))
if err != nil {
return err
}
case mesh.ConditionRouteType:
labels := opts.Labels
base := mesh_proto.Base{
Application: labels[mesh_proto.Application],
Service: labels[mesh_proto.Service],
ID: labels[mesh_proto.ID],
ServiceVersion: labels[mesh_proto.ServiceVersion],
ServiceGroup: labels[mesh_proto.ServiceGroup],
}
key := mesh_proto.BuildServiceKey(base)
path := mesh_proto.GetRoutePath(key, consts.ConditionRoute)
bytes, err := resource.GetSpec().(*mesh_proto.ConditionRoute).ToYAML()
if err != nil {
return err
}
cfg, _ := t.governance.GetConfig(path)
if cfg != "" {
return fmt.Errorf("%s Config is exsited ", path)
}
err = t.governance.SetConfig(path, string(bytes))
if err != nil {
return err
}
case mesh.DynamicConfigType:
labels := opts.Labels
base := mesh_proto.Base{
Application: labels[mesh_proto.Application],
Service: labels[mesh_proto.Service],
ID: labels[mesh_proto.ID],
ServiceVersion: labels[mesh_proto.ServiceVersion],
ServiceGroup: labels[mesh_proto.ServiceGroup],
}
key := mesh_proto.BuildServiceKey(base)
path := mesh_proto.GetOverridePath(key)
//bytes, err := core_model.RuleToYAML(resource.GetSpec())
bytes, err := core_model.ToYAML(resource.GetSpec())
if err != nil {
return fmt.Errorf("failed to marshal dynamic config to yaml %s", err.Error())
}
cfg, _ := t.governance.GetConfig(path)
if cfg != "" {
return fmt.Errorf("%s Config is exsited ", path)
}
err = t.governance.SetConfig(path, string(bytes))
if err != nil {
return err
}
case mesh.AffinityRouteType:
labels := opts.Labels
base := mesh_proto.Base{
Application: labels[mesh_proto.Application],
Service: labels[mesh_proto.Service],
ID: labels[mesh_proto.ID],
ServiceVersion: labels[mesh_proto.ServiceVersion],
ServiceGroup: labels[mesh_proto.ServiceGroup],
}
key := mesh_proto.BuildServiceKey(base)
path := mesh_proto.GetRoutePath(key, consts.AffinityRoute)
bytes, err := core_model.ToYAML(resource.GetSpec())
if err != nil {
return fmt.Errorf("failed to marshal affinity route to yaml %s", err.Error())
}
cfg, _ := t.governance.GetConfig(path)
if cfg != "" {
return fmt.Errorf("%s Config is exsited ", path)
}
err = t.governance.SetConfig(path, string(bytes))
if err != nil {
return err
}
default:
bytes, err := core_model.ToYAML(resource.GetSpec())
if err != nil {
return err
}
path := GenerateCpGroupPath(string(resource.Descriptor().Name), name)
// 使用RegClient
err = t.regClient.SetContent(path, bytes)
if err != nil {
return err
}
}
resource.SetMeta(&resourceMetaObject{
Name: name,
Mesh: opts.Mesh,
CreationTime: opts.CreationTime,
ModificationTime: opts.CreationTime,
Labels: maps.Clone(opts.Labels),
})
if t.eventWriter != nil {
go func() {
t.eventWriter.Send(events.ResourceChangedEvent{
Operation: events.Create,
Type: resource.Descriptor().Name,
Key: core_model.MetaToResourceKey(&resourceMetaObject{
Name: name,
Mesh: opts.Mesh,
}),
})
}()
}
return nil
}