Using the devfile library

Using the devfile library, you can parse and write any devfile, helping you maintain consistent development environments and making it easier for teams to collaborate across shared projects.

Procedure
  • Parse a devfile by running:

// ParserArgs is the struct to pass into parser functions which contains required info for parsing devfile.
parserArgs := parser.ParserArgs{
 	Path:              path,
 	FlattenedDevfile:  &flattenedDevfile,
 	RegistryURLs:      registryURLs,
 	DefaultNamespace:  defaultNamespace,
 	Context:           context,
 	K8sClient:         client,
 }

// Parses the devfile and validates the devfile data
// if top-level variables are not substituted successfully, the warnings can be logged by parsing variableWarning
devfile, variableWarning, err := devfilePkg.ParseDevfileAndValidate(parserArgs)
  • Get specific content from a devfile by running:

// To get all the components from the devfile
components, err := devfile.Data.GetComponents(DevfileOptions{})

// To get all the components from the devfile with attributes tagged - tool: console-import
// & import: {strategy: Dockerfile}
components, err := devfile.Data.GetComponents(DevfileOptions{
   Filter: map[string]interface{}{
 		"tool": "console-import",
 		"import": map[string]interface{}{
 			"strategy": "Dockerfile",
 		},
 	},
})

// To get all the volume components
components, err := devfile.Data.GetComponents(DevfileOptions{
 	ComponentOptions: ComponentOptions{
 		ComponentType: v1.VolumeComponentType,
 	},
})

// To get all the exec commands that belong to the build group
commands, err := devfile.Data.GetCommands(DevfileOptions{
 	CommandOptions: CommandOptions{
 		CommandType: v1.ExecCommandType,
 		CommandGroupKind: v1.BuildCommandGroupKind,
 	},
})
  • Get the Kubernetes objects from the devfile by running:

 // To get a slice of Kubernetes containers of type corev1.Container from the devfile component containers
 containers, err := generator.GetContainers(devfile)

 // To generate a Kubernetes deployment of type v1.Deployment
 deployParams := generator.DeploymentParams{
 	TypeMeta:          generator.GetTypeMeta(deploymentKind, deploymentAPIVersion),
 	ObjectMeta:        generator.GetObjectMeta(name, namespace, labels, annotations),
 	InitContainers:    initContainers,
 	Containers:        containers,
 	Volumes:           volumes,
 	PodSelectorLabels: labels,
 }
 deployment := generator.GetDeployment(deployParams)
  • Update the devfile content by running:

// To update an existing component in the devfile object
err := devfile.Data.UpdateComponent(v1.Component{
	    Name: "component1",
	    ComponentUnion: v1.ComponentUnion{
	    	Container: &v1.ContainerComponent{
	    		Container: v1.Container{
	    			Image: "image1",
             },
         },
     },
})

// To add a new component to the devfile object
err := devfile.Data.AddComponents([]v1.Component{
     {
        Name: "component2",
        ComponentUnion: v1.ComponentUnion{
            Container: &v1.ContainerComponent{
                Container: v1.Container{
                    Image: "image2",
                },
            },
        },
     },
})

// To delete a component from the devfile object
err := devfile.Data.DeleteComponent(componentName)
  • Write a devfile by running:

// If the devfile object has been created with the devfile path already set, can simply call WriteYamlDevfile to write the devfile
err := devfile.WriteYamlDevfile()


// To write to a devfile from scratch
// create a new DevfileData with a specific devfile version
devfileData, err := data.NewDevfileData(devfileVersion)

// set schema version
devfileData.SetSchemaVersion(devfileVersion)

// To add devfile content, use library APIs
devfileData.AddComponents([]v1.Component{...})
devfileData.AddCommands([]v1.Commands{...})
......

// create a new DevfileCtx
ctx := devfileCtx.NewDevfileCtx(devfilePath)
err = ctx.SetAbsPath()

// create devfile object with the new DevfileCtx and DevfileData
devfile := parser.DevfileObj{
 	Ctx:  ctx,
 	Data: devfileData,
}

// write to the devfile on disk
err = devfile.WriteYamlDevfile()