mirror of
https://github.com/kubevela/kubevela.git
synced 2026-08-27 16:17:34 +00:00
support WorkflowSteps and Policies
Signed-off-by: Zheng Xi Zhou <zhengxi.zzx@alibaba-inc.com>
This commit is contained in:
+28
-7
@@ -211,7 +211,7 @@ func launch(server *http.Server, errChan chan<- error) {
|
||||
|
||||
func generateSideBar(capabilities []types.Capability, docsPath string) error {
|
||||
sideBar := filepath.Join(docsPath, SideBar)
|
||||
components, traits, workflowsteps := getDefinitions(capabilities)
|
||||
components, traits, workflowSteps, policies := getDefinitions(capabilities)
|
||||
f, err := os.Create(sideBar)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -236,11 +236,20 @@ func generateSideBar(capabilities []types.Capability, docsPath string) error {
|
||||
if _, err := f.WriteString("- Workflow Steps\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, t := range workflowsteps {
|
||||
for _, t := range workflowSteps {
|
||||
if _, err := f.WriteString(fmt.Sprintf(" - [%s](%s/%s.md)\n", t, types.TypeWorkflowStep, t)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := f.WriteString("- Policies\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, t := range policies {
|
||||
if _, err := f.WriteString(fmt.Sprintf(" - [%s](%s/%s.md)\n", t, types.TypePolicy, t)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -312,7 +321,7 @@ func generateREADME(capabilities []types.Capability, docsPath string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
workloads, traits, workflowsteps := getDefinitions(capabilities)
|
||||
workloads, traits, workflowSteps, policies := getDefinitions(capabilities)
|
||||
|
||||
if _, err := f.WriteString("## Component Types\n"); err != nil {
|
||||
return err
|
||||
@@ -336,16 +345,26 @@ func generateREADME(capabilities []types.Capability, docsPath string) error {
|
||||
if _, err := f.WriteString("## Workflow Steps\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, t := range workflowsteps {
|
||||
for _, t := range workflowSteps {
|
||||
if _, err := f.WriteString(fmt.Sprintf(" - [%s](%s/%s.md)\n", t, types.TypeWorkflowStep, t)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := f.WriteString("## Policies\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, t := range policies {
|
||||
if _, err := f.WriteString(fmt.Sprintf(" - [%s](%s/%s.md)\n", t, types.TypePolicy, t)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getDefinitions(capabilities []types.Capability) ([]string, []string, []string) {
|
||||
var components, traits, workflowSteps []string
|
||||
func getDefinitions(capabilities []types.Capability) ([]string, []string, []string, []string) {
|
||||
var components, traits, workflowSteps, policies []string
|
||||
for _, c := range capabilities {
|
||||
switch c.Type {
|
||||
case types.TypeComponentDefinition:
|
||||
@@ -354,12 +373,14 @@ func getDefinitions(capabilities []types.Capability) ([]string, []string, []stri
|
||||
traits = append(traits, c.Name)
|
||||
case types.TypeWorkflowStep:
|
||||
workflowSteps = append(workflowSteps, c.Name)
|
||||
case types.TypePolicy:
|
||||
policies = append(policies, c.Name)
|
||||
case types.TypeScope:
|
||||
case types.TypeWorkload:
|
||||
default:
|
||||
}
|
||||
}
|
||||
return components, traits, workflowSteps
|
||||
return components, traits, workflowSteps, policies
|
||||
}
|
||||
|
||||
// ShowReferenceConsole will show capability reference in console
|
||||
|
||||
@@ -146,10 +146,15 @@ func TestGetWorkloadAndTraits(t *testing.T) {
|
||||
type want struct {
|
||||
workloads []string
|
||||
traits []string
|
||||
policies []string
|
||||
}
|
||||
workloadName := "component1"
|
||||
traitName := "trait1"
|
||||
scopeName := "scope1"
|
||||
|
||||
var (
|
||||
workloadName = "component1"
|
||||
traitName = "trait1"
|
||||
scopeName = "scope1"
|
||||
policyName = "policy1"
|
||||
)
|
||||
|
||||
cases := map[string]struct {
|
||||
reason string
|
||||
@@ -186,11 +191,22 @@ func TestGetWorkloadAndTraits(t *testing.T) {
|
||||
traits: nil,
|
||||
},
|
||||
},
|
||||
"PolicyTypeCapability": {
|
||||
capabilities: []types.Capability{
|
||||
{
|
||||
Name: policyName,
|
||||
Type: types.TypePolicy,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
policies: []string{policyName},
|
||||
},
|
||||
},
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
gotWorkloads, gotTraits, _ := getDefinitions(tc.capabilities)
|
||||
assert.Equal(t, tc.want, want{workloads: gotWorkloads, traits: gotTraits})
|
||||
gotWorkloads, gotTraits, _, gotPolicies := getDefinitions(tc.capabilities)
|
||||
assert.Equal(t, tc.want, want{workloads: gotWorkloads, traits: gotTraits, policies: gotPolicies})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,20 +73,38 @@ func GetNamespacedCapabilitiesFromCluster(ctx context.Context, namespace string,
|
||||
capabilities = append(capabilities, traits...)
|
||||
}
|
||||
|
||||
// get components from default namespace
|
||||
if workloads, _, err := GetComponentsFromClusterWithValidateOption(ctx, types.DefaultKubeVelaNS, c, selector, false); err == nil {
|
||||
capabilities = append(capabilities, workloads...)
|
||||
if workflowSteps, _, err := GetWorkflowSteps(ctx, namespace, c); err == nil {
|
||||
capabilities = append(capabilities, workflowSteps...)
|
||||
}
|
||||
|
||||
// get traits from default namespace
|
||||
if traits, _, err := GetTraitsFromClusterWithValidateOption(ctx, types.DefaultKubeVelaNS, c, selector, false); err == nil {
|
||||
capabilities = append(capabilities, traits...)
|
||||
if policies, _, err := GetPolicies(ctx, namespace, c); err == nil {
|
||||
capabilities = append(capabilities, policies...)
|
||||
}
|
||||
|
||||
if namespace != types.DefaultKubeVelaNS {
|
||||
// get components from default namespace
|
||||
if workloads, _, err := GetComponentsFromClusterWithValidateOption(ctx, types.DefaultKubeVelaNS, c, selector, false); err == nil {
|
||||
capabilities = append(capabilities, workloads...)
|
||||
}
|
||||
|
||||
// get traits from default namespace
|
||||
if traits, _, err := GetTraitsFromClusterWithValidateOption(ctx, types.DefaultKubeVelaNS, c, selector, false); err == nil {
|
||||
capabilities = append(capabilities, traits...)
|
||||
}
|
||||
|
||||
if workflowSteps, _, err := GetWorkflowSteps(ctx, types.DefaultKubeVelaNS, c); err == nil {
|
||||
capabilities = append(capabilities, workflowSteps...)
|
||||
}
|
||||
|
||||
if policies, _, err := GetPolicies(ctx, types.DefaultKubeVelaNS, c); err == nil {
|
||||
capabilities = append(capabilities, policies...)
|
||||
}
|
||||
}
|
||||
|
||||
if len(capabilities) > 0 {
|
||||
return capabilities, nil
|
||||
}
|
||||
return nil, fmt.Errorf("could not find any components or traits from namespace %s and %s", namespace, types.DefaultKubeVelaNS)
|
||||
return nil, fmt.Errorf("could not find any components, traits or workflowSteps from namespace %s and %s", namespace, types.DefaultKubeVelaNS)
|
||||
}
|
||||
|
||||
// GetComponentsFromCluster will get capability from K8s cluster
|
||||
@@ -184,6 +202,58 @@ func GetTraitsFromClusterWithValidateOption(ctx context.Context, namespace strin
|
||||
return templates, templateErrors, nil
|
||||
}
|
||||
|
||||
// GetWorkflowSteps will get WorkflowStepDefinition list
|
||||
func GetWorkflowSteps(ctx context.Context, namespace string, c common.Args) ([]types.Capability, []error, error) {
|
||||
newClient, err := c.GetClient()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var templates []types.Capability
|
||||
var workflowStepDefs v1beta1.WorkflowStepDefinitionList
|
||||
err = newClient.List(ctx, &workflowStepDefs, &client.ListOptions{Namespace: namespace})
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("list WorkflowStepDefinition err: %w", err)
|
||||
}
|
||||
|
||||
var templateErrors []error
|
||||
for _, def := range workflowStepDefs.Items {
|
||||
tmp, err := GetCapabilityByWorkflowStepDefinitionObject(def, nil)
|
||||
if err != nil {
|
||||
templateErrors = append(templateErrors, err)
|
||||
continue
|
||||
}
|
||||
templates = append(templates, *tmp)
|
||||
}
|
||||
return templates, templateErrors, nil
|
||||
}
|
||||
|
||||
// GetPolicies will get Policy from K8s cluster
|
||||
func GetPolicies(ctx context.Context, namespace string, c common.Args) ([]types.Capability, []error, error) {
|
||||
newClient, err := c.GetClient()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var templates []types.Capability
|
||||
var defs v1beta1.PolicyDefinitionList
|
||||
err = newClient.List(ctx, &defs, &client.ListOptions{Namespace: namespace})
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("list PolicyDefinition err: %w", err)
|
||||
}
|
||||
|
||||
var templateErrors []error
|
||||
for _, def := range defs.Items {
|
||||
tmp, err := GetCapabilityByPolicyDefinitionObject(def, nil)
|
||||
if err != nil {
|
||||
templateErrors = append(templateErrors, err)
|
||||
continue
|
||||
}
|
||||
templates = append(templates, *tmp)
|
||||
}
|
||||
return templates, templateErrors, nil
|
||||
}
|
||||
|
||||
// validateCapabilities validates whether helm charts are successful installed, GVK are successfully retrieved.
|
||||
func validateCapabilities(tmp *types.Capability, dm discoverymapper.DiscoveryMapper, definitionName string, reference commontypes.DefinitionReference) error {
|
||||
var err error
|
||||
@@ -411,11 +481,7 @@ func GetCapabilityByTraitDefinitionObject(traitDef v1beta1.TraitDefinition) (*ty
|
||||
|
||||
// GetCapabilityByWorkflowStepDefinitionObject gets capability by WorkflowStepDefinition object
|
||||
func GetCapabilityByWorkflowStepDefinitionObject(wfStepDef v1beta1.WorkflowStepDefinition, pd *packages.PackageDiscover) (*types.Capability, error) {
|
||||
var (
|
||||
capability types.Capability
|
||||
err error
|
||||
)
|
||||
capability, err = HandleDefinition(wfStepDef.Name, wfStepDef.Spec.Reference.Name, wfStepDef.Annotations, wfStepDef.Labels,
|
||||
capability, err := HandleDefinition(wfStepDef.Name, wfStepDef.Spec.Reference.Name, wfStepDef.Annotations, wfStepDef.Labels,
|
||||
nil, types.TypeWorkflowStep, nil, wfStepDef.Spec.Schematic, pd)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to handle WorkflowStepDefinition")
|
||||
@@ -423,3 +489,14 @@ func GetCapabilityByWorkflowStepDefinitionObject(wfStepDef v1beta1.WorkflowStepD
|
||||
capability.Namespace = wfStepDef.Namespace
|
||||
return &capability, nil
|
||||
}
|
||||
|
||||
// GetCapabilityByPolicyDefinitionObject gets capability by PolicyDefinition object
|
||||
func GetCapabilityByPolicyDefinitionObject(def v1beta1.PolicyDefinition, pd *packages.PackageDiscover) (*types.Capability, error) {
|
||||
capability, err := HandleDefinition(def.Name, def.Spec.Reference.Name, def.Annotations, def.Labels,
|
||||
nil, types.TypePolicy, nil, def.Spec.Schematic, pd)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to handle PolicyDefinition")
|
||||
}
|
||||
capability.Namespace = def.Namespace
|
||||
return &capability, nil
|
||||
}
|
||||
|
||||
@@ -649,7 +649,7 @@ func (ref *MarkdownReference) CreateMarkdown(ctx context.Context, caps []types.C
|
||||
specification string
|
||||
)
|
||||
if c.Type != types.TypeWorkload && c.Type != types.TypeComponentDefinition && c.Type != types.TypeTrait &&
|
||||
c.Type != types.TypeWorkflowStep {
|
||||
c.Type != types.TypeWorkflowStep && c.Type != types.TypePolicy {
|
||||
return fmt.Errorf("the type of the capability is not right")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user