blob: 3ae26b32e653b5aeeea0e913d652b1e1fce8cb7d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>What is a Che-Theia plug-in :: Eclipse Che Documentation</title>
<link rel="canonical" href="https://www.eclipse.org/che/docs/che-7/end-user-guide/what-is-a-che-theia-plug-in/">
<meta name="keywords" content="end-user-guide, what-is-a-che-theia-plug-in">
<meta name="generator" content="Antora 2.3.4">
<link rel="stylesheet" href="../../../_/css/site.css">
<link rel="stylesheet" href="../../../_/css/extra.css">
<link rel="stylesheet" href="../../../_/font-awesome-4.7.0/css/font-awesome.min.css">
<link rel="icon" href="../../../favicon.ico" type="image/x-icon">
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-37306001-2"></script>
<script>function gtag(){dataLayer.push(arguments)};window.dataLayer=window.dataLayer||[];gtag('js',new Date());gtag('config','UA-37306001-2')</script>
<script>var uiRootPath = '../../../_'</script>
</head>
<body class="article">
<header class="header" role="banner">
<nav class="navbar">
<div class="navbar-brand">
<div class="navbar-item">
<button class="navbar-burger" data-target="topbar-nav">
<span></span>
<span></span>
<span></span>
</button>
<img src="../../../_/img/icon-eclipse-che.svg" class="navbar-logo" alt="Eclipse Che logo">
<a href="https://www.eclipse.org/che/docs">Eclipse Che Documentation</a>
</div>
</div>
<div id="topbar-nav" class="navbar-menu">
<div class="navbar-end">
<div class="navbar-item hide-for-print">
<script async src="https://cse.google.com/cse.js?cx=002898025167115630151:gnr5edrg2eo"></script>
<div class="gcse-searchbox" enableAutoComplete="true"></div>
</div>
<a class="navbar-item" href="https://www.eclipse.org/che/docs">Home</a>
<a class="navbar-item" href="https://che.eclipse.org/">Blog</a>
<a class="navbar-item" href="https://github.com/eclipse/che">Source Code</a>
</div>
</div>
</nav>
<div class="gcse-searchresults"></div>
</header><div class="body">
<div class="nav-container" data-component="che-7" data-version="master">
<aside class="nav">
<div class="panels">
<div class="nav-panel-menu is-active" data-panel="menu">
<nav class="nav-menu">
<h3 class="title"><a href="../../overview/introduction-to-eclipse-che/">Documentation</a></h3>
<ul class="nav-list">
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../overview/introduction-to-eclipse-che/">Introduction to Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../overview/che-architecture/">Che architecture</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../hosted-che/hosted-che/">Eclipse Che hosted by Red Hat</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<button class="nav-item-toggle"></button>
<span class="nav-text">End-user Guide</span>
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../navigating-che/">Navigating Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../navigating-che-using-the-dashboard/">Navigating Che: dashboard</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../importing-certificates-to-browsers/">Importing certificates to browsers</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../accessing-che-from-openshift-developer-perspective/">Navigating Che from OpenShift Developer Perspective</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../che-theia-ide-basics/">Che-Theia IDE basics</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../defining-custom-commands-for-che-theia/">Defining custom commands for Che-Theia</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../version-control/">Version Control</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../che-theia-troubleshooting/">Che-Theia Troubleshooting</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../differences-in-how-che-theia-webview-works-on-a-single-host-mode-comparing-to-a-multi-host-mode/">Differences in how Che-Theia Webview works on a single-host mode comparing to a multi-host mode</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../workspaces-overview/">Using developer workspaces</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../creating-a-workspace-from-code-sample/">Creating a workspace from code sample</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../creating-a-workspace-from-remote-devfile/">Creating a workspace from a remote devfile using the dashboard</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../creating-a-workspace-from-local-devfile-using-chectl/">Creating a workspace from local devfile using chectl</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../creating-a-workspace-by-importing-the-source-code-of-a-project/">Creating a workspace by importing the source code of a project</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../configuring-a-workspace-with-dashboard/">Configuring a workspace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../running-a-workspace-with-dashboard/">Running a workspace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../importing-kubernetes-applications-into-a-workspace/">Importing Kubernetes applications into a workspace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../remotely-accessing-workspaces/">Remotely accessing workspaces</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../mounting-a-secret-as-a-file-or-an-environment-variable-into-a-workspace-container/">Mounting a secret as a file or an environment variable into a workspace container</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../authenticating-on-scm-server-with-a-personal-access-token/">Authenticating on SCM Server with a personal access token</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../authoring-devfiles/">Authoring devfiles</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../authoring-devfiles-version-1/">Authoring devfiles version 1</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../authoring-devfiles-version-2/">Authoring devfiles version 2</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../customizing-developer-environments/">Customizing developer environments</a>
<ul class="nav-list">
<li class="nav-item is-current-page" data-depth="2">
<a class="nav-link" href="./">What is a Che-Theia plug-in</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../adding-a-vs-code-extension-to-a-workspace/">Adding a VS Code extension to a workspace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../adding-a-vs-code-extension-to-the-che-plugin-registry/">Adding a VS Code extension to the Che plug-ins registry</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../publishing-metadata-for-a-vs-code-extension/">Publishing a VS Code extension</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../testing-a-visual-studio-code-extension-in-che/">Testing a VS Code extension in Che</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../using-alternative-ides-in-che/">Using alternative IDEs in Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../support-for-jetbrains-ides/">JetBrains IDEs</a>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../using-jetbrains-intellij-idea-community-edition/">Using IntelliJ Idea Community Edition</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../using-jetbrains-intellij-idea-ultimate-edition/">Using IntelliJ Idea Ultimate Edition</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../configuring-an-existing-workspace-to-use-intellij-idea/">Configuring an existing workspace to use IntelliJ IDEA</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../using-jetbrains-webstorm/">Using WebStorm</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../provisioning-jetbrains-activation-code-for-offline-use/">Provisioning activation code for offline use</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../support-for-theia-based-ides/">Theia-based IDEs</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../adding-tools-to-che-after-creating-a-workspace/">Adding tools to Che after creating a workspace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-private-container-registries/">Using private container registries</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../using-artifact-repositories-in-a-restricted-environment/">Using artifact repositories in a restricted environment</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-maven-artifact-repositories/">Using Maven artifact repositories</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-gradle-artifact-repositories/">Using Gradle artifact repositories</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-python-artifact-repositories/">Using Python artifact repositories</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-go-artifact-repositories/">Using Go artifact repositories</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-nuget-artifact-repositories/">Using NuGet artifact repositories</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../using-npm-artifact-repositories/">Using npm artifact repositories</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../troubleshooting-che/">Troubleshooting Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../viewing-che-workspaces-logs/">Viewing Che workspaces logs</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../investigating-failures-at-a-workspace-start-using-the-verbose-mode/">Troubleshooting workspace start failures</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../troubleshooting-slow-workspaces/">Troubleshooting slow workspaces</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../troubleshooting-network-problems/">Troubleshooting network problems</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<button class="nav-item-toggle"></button>
<span class="nav-text">Installation Guide</span>
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../installation-guide/supported-platforms/">Supported platforms</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../installation-guide/configuring-the-che-installation/">Configuring the Che installation</a>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/installing-che/">Installing Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/installing-che-in-cloud/">Installing Che in cloud</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-openshift-4-using-operatorhub/">Installing Che on OpenShift 4 using OperatorHub</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-openshift-4-using-cli/">Installing Che on OpenShift 4 using CLI</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-openshift-3-using-the-operator/">Installing Che on OpenShift 3</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-kubespray/">Installing Che on Kubespray</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-aws/">Installing Che on AWS</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-google-cloud-platform/">Installing Che on Google Cloud</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-microsoft-azure/">Installing Che on Microsoft Azure</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/installing-che-locally/">Installing Che locally</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-codeready-containers/">Installing Che on CodeReady Containers</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-docker-desktop/">Installing Che on Docker Desktop</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-minikube/">Installing Che on Minikube</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-minishift/">Installing Che on Minishift</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../installation-guide/installing-che-on-kind/">Installing Che on Kind</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/using-the-chectl-management-tool/">Using the chectl management tool</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/installing-che-in-a-restricted-environment/">Installing Che in restricted environment</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/advanced-configuration/">Advanced configuration</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/advanced-configuration-options-for-the-che-server-component/">Advanced configuration options for Che server</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-namespace-strategies/">Configuring workspace target namespace</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-storage-strategies/">Configuring storage strategies</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-storage-types/">Configuring storage types</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-the-number-of-workspaces-that-a-user-can-run/">Configuring the number of workspaces that a user can run</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-the-number-of-workspaces-that-a-user-can-create/">Configuring the number of workspaces that a user can create</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-workspace-exposure-strategies/">Configuring workspace exposure strategies</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-workspaces-nodeselector/">Configuring workspaces nodeSelector</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-che-hostname/">Configuring Che hostname</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-ingresses/">Configuring Kubernetes Ingress</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/configuring-routes/">Configuring OpenShift Route</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/deploying-che-with-support-for-git-repositories-with-self-signed-certificates/">Deploying Che with support for Git repositories with self-signed certificates</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/installing-che-using-storage-classes/">Installing Che using storage classes</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/importing-untrusted-tls-certificates/">Importing untrusted TLS certificates to Che</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/switching-between-external-and-internal-communication/">Switching between external and internal ways in inter-component communication</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/setting-up-the-keycloak-che-username-readonly-theme-for-the-eclipse-che-login-page/">Setting up the Keycloak che-username-readonly theme for the Eclipse Che login page</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/mounting-a-secret-as-a-file-or-an-environment-variable-into-a-container/">Mounting a Secret or a ConfigMap as a file or an environment variable into a Eclipse&#160;Che container</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/enabling-dev-workspace-engine/">Enabling Dev Workspace engine</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/upgrading-che/">Upgrading Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/upgrading-che-using-operatorhub/">Upgrading Che using OperatorHub</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/upgrading-che-using-the-cli-management-tool/">Upgrading Che using the CLI management tool</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/upgrading-che-using-the-cli-management-tool-in-restricted-environment/">Upgrading Che in restricted environment</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/upgrading-che-namespace-strategies-other-than-per-user/">Updating Che namespace strategies other than 'per user'</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../installation-guide/uninstalling-che/">Uninstalling Che</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/uninstalling-che-after-operatorhub-installation-using-openshift-web-console/">Using the OpenShift web console</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/uninstalling-che-after-operatorhub-installation-using-openshift-cli/">Using OpenShift CLI</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../installation-guide/uninstalling-che-after-chectl-installation/">Using chectl</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<button class="nav-item-toggle"></button>
<span class="nav-text">Administration Guide</span>
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/che-architecture-overview/">Che architecture</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/che-workspace-controller/">Che workspace controller</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/che-workspaces-architecture/">Che workspaces architecture</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../administration-guide/calculating-che-resource-requirements/">Calculating Che resource requirements</a>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/customizing-the-registries/">Customizing the registries</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/building-custom-registry-images/">Building custom registry images</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/running-custom-registries/">Running custom registries</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/retrieving-che-logs/">Retrieving Che logs</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/configuring-server-logging/">Configuring server logging</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/viewing-kubernetes-events/">Accessing Kubernetes events on OpenShift</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/viewing-operator-events/">Viewing the Operator events on OpenShift</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/viewing-che-server-logs/">Viewing Che server logs</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/viewing-external-service-logs/">Viewing external service logs</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/viewing-plug-in-broker-logs/">Viewing Plug-in broker logs</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/collecting-logs-using-chectl/">Collecting logs using chectl</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../administration-guide/monitoring-che/">Monitoring Che</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../administration-guide/tracing-che/">Tracing Che</a>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/backup-and-disaster-recovery/">Backup and disaster recovery</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/external-database-setup/">External database setup</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/persistent-volumes-backups/">Persistent Volumes backups</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/caching-images-for-faster-workspace-start/">Caching images for faster workspace start</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/defining-the-list-of-images-to-pull/">Defining the list of images</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/defining-the-memory-parameters-for-the-image-puller/">Defining the memory settings</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/installing-image-puller-using-che-operator/">Installing using the Che Operator</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/installing-image-puller-on-kubernetes-using-the-image-puller-operator/">Installing using the Kubernetes Image Puller Operator</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/installing-image-puller-on-openshift-using-operatorhub/">Installing on OpenShift 4</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/installing-image-puller-on-openshift-using-openshift-templates/">Installing on OpenShift 3</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/installing-image-puller-on-kubernetes-using-helm/">Installing using Helm</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../administration-guide/managing-identities-and-authorizations/">Managing identities and authorizations</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/authenticating-users/">Authenticating users</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/authorizing-users/">Authorizing users</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/configuring-authorization/">Configuring authorization</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/configuring-openshift-oauth/">Configuring OpenShift OAuth</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../administration-guide/removing-user-data/">Removing user data</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<button class="nav-item-toggle"></button>
<span class="nav-text">Contributor Guide</span>
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/branding-che-theia/">Branding Che-Theia</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/developing-che-theia-plug-ins/">Developing Che-Theia plug-ins</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/testing-che-theia-plug-ins/">Testing Che-Theia plug-ins</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/publishing-che-theia-plug-ins/">Publishing Che-Theia plug-ins</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/adding-support-for-a-new-language/">Adding support for a new language</a>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../contributor-guide/adding-support-for-a-new-debugger/">Adding support for a new debugger</a>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../contributor-guide/che-extensibility-reference/">Che extensibility reference</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../contributor-guide/che-extension-points/">Che extension points</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../contributor-guide/che-theia-plug-in-api/">Che-Theia plug-in API</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../contributor-guide/debug-adapter-protocol/">Debug Adapter Protocol</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../contributor-guide/language-server-protocol/">Language Server Protocol</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<button class="nav-item-toggle"></button>
<span class="nav-text">Extensions</span>
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../extensions/eclipse-che4z/">Eclipse Che4z</a>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../extensions/openshift-connector-overview/">OpenShift Connector</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/features-of-openshift-connector/">Features of OpenShift Connector</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/installing-openshift-connector-in-che/">Installing OpenShift Connector in Eclipse Che</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/authenticating-with-openshift-connector-from-che/">Authenticating with OpenShift Connector from Eclipse Che</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/creating-components-with-openshift-connector-in-che/">Creating Components with OpenShift Connector in Eclipse Che</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/connecting-source-code-from-github-to-a-openshift-component-using-openshift-connector/">Connecting source code from GitHub to a OpenShift Component</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../extensions/telemetry/">Telemetry</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/creating-a-telemetry-plugin/">Creating A Telemetry Plugin</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../extensions/the-woopra-telemetry-plugin/">The Woopra Telemetry Plugin</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../extensions/java-lombok/">Java Lombok</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<a class="nav-link" href="../../glossary/che-glossary/">Che glossary</a>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
<div class="context">
<span class="title">Documentation</span>
<span class="version">master</span>
</div>
<ul class="components">
<li class="component is-current">
<a class="title" href="../../overview/introduction-to-eclipse-che/">Documentation</a>
<ul class="versions">
<li class="version is-current is-latest">
<a href="../../overview/introduction-to-eclipse-che/">master</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</div>
<main class="article">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
<a href="../../overview/introduction-to-eclipse-che/" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
<ul>
<li><a href="../../overview/introduction-to-eclipse-che/">Documentation</a></li>
<li>End-user Guide</li>
<li><a href="../customizing-developer-environments/">Customizing developer environments</a></li>
<li><a href="./">What is a Che-Theia plug-in</a></li>
</ul>
</nav>
<div class="edit-this-page"><a href="https://github.com/eclipse/che-docs/edit/master/modules/end-user-guide/pages/what-is-a-che-theia-plug-in.adoc">Edit this Page</a></div>
</div>
<div class="content">
<aside class="toc sidebar" data-title="Contents" data-levels="2">
<div class="toc-menu"></div>
</aside>
<article class="doc">
<h1 class="page">What is a Che-Theia plug-in</h1>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>A Che-Theia plug-in is an extension of the development environment isolated from the IDE. Plug-ins can be packaged as files or containers to provide their own dependencies.</p>
</div>
<div class="paragraph">
<p>Extending Che-Theia using plug-ins can enable the following capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Language support:</strong> Extend the supported languages by relying on the <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol</a>.</p>
</li>
<li>
<p><strong>Debuggers:</strong> Extend debugging capabilities with the <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter Protocol</a>.</p>
</li>
<li>
<p><strong>Development Tools:</strong> Integrate your favorite linters, and as testing and performance tools.</p>
</li>
<li>
<p><strong>Menus, panels, and commands:</strong> Add your own items to the IDE components.</p>
</li>
<li>
<p><strong>Themes:</strong> Build custom themes, extend the UI, or customize icon themes.</p>
</li>
<li>
<p><strong>Snippets, code formatting, and syntax highlighting:</strong> Enhance comfort of use with supported programming languages.</p>
</li>
<li>
<p><strong>Keybindings:</strong> Add new keyboard mapping and popular keybindings to make the environment feel natural.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_features_and_benefits_of_che_theia_plug_ins"><a class="anchor" href="#_features_and_benefits_of_che_theia_plug_ins"></a>Features and benefits of Che-Theia plug-ins</h2>
<div class="sectionbody">
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>Features</strong></th>
<th class="tableblock halign-left valign-top"><strong>Description</strong></th>
<th class="tableblock halign-left valign-top"><strong>Benefits</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Fast Loading</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are loaded at runtime and are already compiled. IDE is loading the plug-in code.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Avoid any compilation time. Avoid post-installation steps.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Secure Loading</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are loaded separately from the IDE. The IDE stays always in a usable state.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins do not break the whole IDE if it has bugs. Handle network issue.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Tools Dependencies</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Dependencies for the plug-in are packaged with the plug-in in its own container.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">No-installation for tools. Dependencies running into container.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Code Isolation</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Guarantee that plug-ins cannot block the main functions of the IDE like opening a file or typing</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are running into separate threads. Avoid dependencies mismatch.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>VS Code Extension Compatibility</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Extend the capabilities of the IDE with existing VS Code Extensions.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Target multiple platform. Allow easy discovery of Visual Studio Code Extension with required installation.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="che-theia-plug-in-concept-in-detail_che"><a class="anchor" href="#che-theia-plug-in-concept-in-detail_che"></a>Che-Theia plug-in concept in detail</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse&#160;Che provides a default web IDE for workspaces: Che-Theia. It is based on Eclipse Theia. It is a slightly different version than the plain Eclipse Theia one because there are functionalities that have been added based on the nature of the Eclipse&#160;Che workspaces. This version of Eclipse Theia for Che is called <strong>Che-Theia</strong>.</p>
</div>
<div class="paragraph">
<p>You can extend the IDE provided with Eclipse&#160;Che by building a <strong>Che-Theia plug-in</strong>. Che-Theia plug-ins are compatible with any other Eclipse Theia-based IDE.</p>
</div>
<div class="sect2">
<h3 id="client-side-and-server-side-che-theia-plug-ins_che"><a class="anchor" href="#client-side-and-server-side-che-theia-plug-ins_che"></a>Client-side and server-side Che-Theia plug-ins</h3>
<div class="paragraph">
<p>The Che-Theia editor plug-ins let you add languages, debuggers, and tools to your installation to support your development workflow. Plug-ins run when the editor completes loading. If a Che-Theia plug-in fails, the main Che-Theia editor continues to work.</p>
</div>
<div class="paragraph">
<p>Che-Theia plug-ins run either on the client side or on the server side. This is a scheme of the client and server-side plug-in concept:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../_images/extensibility/client-server-side-plug-ins.svg" alt="client server side plug ins">
</div>
<div class="title">Figure 1. Client and server-side Che-Theia plug-ins</div>
</div>
<div class="paragraph">
<p>The same Che-Theia plug-in API is exposed to plug-ins running on the client side (Web Worker) or the server side (Node.js).</p>
</div>
</div>
<div class="sect2">
<h3 id="che-theia-plug-in-apis_che"><a class="anchor" href="#che-theia-plug-in-apis_che"></a>Che-Theia plug-in APIs</h3>
<div class="paragraph">
<p>For the purpose of providing tool isolation and easy extensibility in Eclipse&#160;Che, the Che-Theia IDE has a set of plug-in APIs. The APIs are compatible with Visual Studio Code extension APIs. In most cases, Che-Theia can run VS Code extensions as its own plug-ins.</p>
</div>
<div class="paragraph">
<p>When developing a plug-in that depends on or interacts with components of Che workspaces (containers, preferences, factories), use the Che APIs embedded in Che-Theia.</p>
</div>
</div>
<div class="sect2">
<h3 id="che-theia-plug-in-capabilities_che"><a class="anchor" href="#che-theia-plug-in-capabilities_che"></a>Che-Theia plug-in capabilities</h3>
<div class="paragraph">
<p>Che-Theia plug-ins have the following capabilities:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>Plug-in</strong></th>
<th class="tableblock halign-left valign-top"><strong>Description</strong></th>
<th class="tableblock halign-left valign-top"><strong>Repository</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Extended Tasks</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Handles the Che commands and provides the ability to start those into a specific container of the workspace.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/task-plugin">Task plug-in</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Extended Terminal</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Allows to provide terminal for any of the containers of the workspace.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-terminal">Extended Terminal extension</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Factory</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Handles the Eclipse&#160;Che Factories</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/workspace-plugin">Workspace plug-in</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Container</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Provides a container view that shows all the containers that are running in the workspace and allows to interact with them.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/containers-plugin">Containers plug-in</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Dashboard</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integrates the IDE with the <strong>Dashboard</strong> and facilitate the navigation.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-dashboard">Che-Theia Dashbord extension</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che APIs</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Extends the IDE APIs to allow interacting with Che-specific components (workspaces, preferences).</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-plugin-ext">Che-Theia API extension</a></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="vs-code-extensions-and-eclipse-theia-plug-ins_che"><a class="anchor" href="#vs-code-extensions-and-eclipse-theia-plug-ins_che"></a>VS Code extensions and Eclipse Theia plug-ins</h3>
<div class="paragraph">
<p>A Che-Theia plug-in can be based on a VS Code extension or an Eclipse Theia plug-in.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">A Visual Studio Code extension</dt>
<dd>
<p>To repackage a VS Code extension as a Che-Theia plug-in with its own set of dependencies, package the dependencies into a container. This ensures that Eclipse&#160;Che users do not need to install the dependencies when using the extension. See <a href="../adding-a-vs-code-extension-to-a-workspace/" class="page">Adding a VS Code extension to a workspace</a>.</p>
</dd>
<dt class="hdlist1">An Eclipse Theia plug-in</dt>
<dd>
<p>You can build a Che-Theia plug-in by implementing an Eclipse Theia plug-in and packaging it to Eclipse&#160;Che.</p>
</dd>
</dl>
</div>
<div class="ulist">
<div class="title">Additional resources</div>
<ul>
<li>
<p><a href="#embedded-and-remote-che-theia-plug-ins_che">Embedded and remote Che-Theia plug-ins</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><!-- vale Vale.Spelling = NO --></p>
</div>
<div class="paragraph">
<p><!-- vale Vale.Terms = NO --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.Usage = NO --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.PassiveVoice = NO --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.Slash = NO --></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="che-theia-plug-in-metadata_che"><a class="anchor" href="#che-theia-plug-in-metadata_che"></a>Che-Theia plug-in metadata</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Che-Theia plug-in metadata is information about individual plug-ins for the plug-in registry.</p>
</div>
<div class="paragraph">
<p>The Che-Theia plug-in metadata, for each specific plug-in, is defined in a <code>meta.yaml</code> file. These files can be referenced in a devfile to include Che-Theia plug-ins in a workspace.</p>
</div>
<div class="paragraph">
<p>Here is an overview of all fields that can be available in plugin meta YAML files. This document represents the <a href="https://github.com/eclipse-che/che-plugin-registry#user-content-plugin-meta-yaml-structure">plugin meta YAML structure (version 3)</a>.</p>
</div>
<div class="paragraph">
<p>In the <a href="https://github.com/eclipse-che/che-plugin-registry/tree/7.32.0">Che plug-ins registry repository</a>, the <code>che-theia-plugins.yaml</code> contains a list of all Che-Theia plug-ins in the registry. Build the registry container image to generate the <code>meta.yaml</code> file.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. <code>meta.yml</code></caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>apiVersion</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version 2 and higher where version is 1 supported for backwards compatibility</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>category</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Available: Category must be set to one of the followings: <code>Editor</code>, <code>Debugger</code>, <code>Formatter</code>, <code>Language</code>, <code>Linter</code>, <code>Snippet</code>, <code>Theme</code>, <code>Other</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>description</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Short description of plugin&#8217;s purpose</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>displayName</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name shown in user dashboard</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>deprecate</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; section for deprecating plugins in favor of others</p>
<p class="tableblock"> * autoMigrate - boolean</p>
<p class="tableblock"> * migrateTo - new <code>org/plugin-id/version</code>, for example <code>redhat/vscode-apache-camel/latest</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>firstPublicationDate</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Not required to be present in YAML, as if not present, it will be generated during Plugin Registry dockerimage build</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>latestUpdateDate</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Not required to be present in YAML, as if not present, it will be generated during Plugin Registry dockerimage build</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>icon</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">URL of an SVG or PNG icon</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name (no spaces allowed), must match [-a-z0-9]</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>publisher</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name of the publisher, must match [-a-z0-9]</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>repository</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">URL for plugin repository, for example, GitHub</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>title</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plugin title (long)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>type</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Che Plugin</code>, <code>VS Code extension</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>version</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version information, for example: 7.5.1, [-.a-z0-9]</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>spec</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specifications (see below)</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 2. <code>spec</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>endpoints</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; plugin endpoint.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>containers</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; sidecar containers for the plug-in. Che Plugin and VS Code extension supports only one container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>initContainers</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; sidecar init containers for the plug-in</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>workspaceEnv</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; environment variables for the workspace</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>extensions</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; Attribute that is required for VS Code and Che-Theia plug-ins in a form list of URLs to plug-in artefacts, such as .vsix or .theia files</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 3. <code>spec.containers</code>. Notice: <code>spec.initContainers</code> has absolutely the same container definition.</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sidecar container name</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>image</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Absolute or relative container image URL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>memoryLimit</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift memory limit string, for example <code>512Mi</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>memoryRequest</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift memory request string, for example <code>512Mi</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cpuLimit</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift CPU limit string, for example <code>2500m</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cpuRequest</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift CPU request string, for example <code>125m</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>env</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List of environment variables to set in the sidecar</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>command</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String array definition of the root process command in the container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>args</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String array arguments for the root process command in the container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>volumes</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Volumes required by the plug-in</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ports</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Ports exposed by the plug-in (on the container)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>commands</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Development commands available to the plug-in container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>mountSources</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean flag to bound volume with source code <code>/projects</code> to the plug-in container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>initContainers</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Optional; init containers for sidecar plugin</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Lifecycle</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Container lifecycle hooks. See <a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/"><code>lifecycle</code> description</a></p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 4. <code>spec.containers.env</code> and <code>spec.initContainers.env</code> attributes. Notice: <code>workspaceEnv</code> has absolutely the same attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Environment variable name</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>value</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Environment variable value</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 5. <code>spec.containers.volumes</code> and <code>spec.initContainers.volumes</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>mountPath</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Path to the volume in the container</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Volume name</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ephemeral</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">If true, the volume is ephemeral, otherwise the volume is persisted</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 6. <code>spec.containers.ports</code> and <code>spec.initContainers.ports</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>exposedPort</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Exposed port</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 7. <code>spec.containers.commands</code> and <code>spec.initContainers.commands</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Command name</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>workingDir</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Command working directory</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>command</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">String array that defines the development command</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 8. <code>spec.endpoints</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name (no spaces allowed), must match [-a-z0-9]</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>targetPort</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Target port</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>attributes</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Endpoint attributes</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 9. <code>spec.endpoints.attributes</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protocol</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Protocol, example: <code>ws</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>type</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ide</code>, <code>ide-dev</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>discoverable</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>secure</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code>. If <code>true</code>, then the endpoint is assumed to listen solely on <code>127.0.0.1</code> and is exposed using a JWT proxy</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cookiesAuthEnabled</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>requireSubdomain</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code>. If <code>true</code>, the endpoint is exposed on subdomain in single-host mode.</p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 10. <code>spec.containers.lifecycle</code> and <code>spec.initContainers.lifecycle</code> attributes</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>postStart</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The <code>postStart</code> event that runs immediately after a Container is started. See <a href="https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/">postStart and preStop handlers</a></p>
<p class="tableblock">* <code>exec</code>: Executes a specific command, resources consumed by the command are counted against the Container</p>
<p class="tableblock">* <code>command</code>: ["/bin/sh", "-c", "/bin/post-start.sh"]</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>preStop</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The <code>preStop</code> event that runs before a Container is terminated. See <a href="https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/">postStart and preStop handlers</a></p>
<p class="tableblock">* <code>exec</code>: Executes a specific command, resources consumed by the command are counted against the Container</p>
<p class="tableblock">* <code>command</code>: ["/bin/sh", "-c", "/bin/post-start.sh"]</p></td>
</tr>
</tbody>
</table>
<div class="listingblock">
<div class="title">Example <code>meta.yaml</code> for a Che-Theia plug-in: the Che machine-exec Service</div>
<div class="content">
<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml"> apiVersion: v2
publisher: eclipse
name: che-machine-exec-plugin
version: 7.9.2
type: Che Plugin
displayName: Che machine-exec Service
title: Che machine-exec Service Plugin
description: Che Plug-in with che-machine-exec service to provide creation terminal
or tasks for Eclipse CHE workspace containers.
icon: https://www.eclipse.org/che/images/logo-eclipseche.svg
repository: https://github.com/eclipse-che/che-machine-exec/
firstPublicationDate: "2020-03-18"
category: Other
spec:
endpoints:
- name: "che-machine-exec"
public: true
targetPort: 4444
attributes:
protocol: ws
type: terminal
discoverable: false
secure: true
cookiesAuthEnabled: true
containers:
- name: che-machine-exec
image: "quay.io/eclipse/che-machine-exec:7.9.2"
ports:
- exposedPort: 4444
command: ['/go/bin/che-machine-exec', '--static', '/cloud-shell', '--url', '127.0.0.1:4444']</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Example <code>meta.yaml</code> for a VisualStudio Code extension: the AsciiDoc support extension</div>
<div class="content">
<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2
category: Language
description: This extension provides a live preview, syntax highlighting and snippets for the AsciiDoc format using Asciidoctor flavor
displayName: AsciiDoc support
firstPublicationDate: "2019-12-02"
icon: https://www.eclipse.org/che/images/logo-eclipseche.svg
name: vscode-asciidoctor
publisher: joaompinto
repository: https://github.com/asciidoctor/asciidoctor-vscode
title: AsciiDoctor Plug-in
type: VS Code extension
version: 2.7.7
spec:
extensions:
- https://github.com/asciidoctor/asciidoctor-vscode/releases/download/v2.7.7/asciidoctor-vscode-2.7.7.vsix</code></pre>
</div>
</div>
<div class="paragraph">
<p><!-- vale Vale.Spelling = YES --></p>
</div>
<div class="paragraph">
<p><!-- vale Vale.Terms = YES --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.Usage = YES --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.PassiveVoice = YES --></p>
</div>
<div class="paragraph">
<p><!-- vale IBM.Slash = YES --></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="che-theia-plug-in-lifecycle_che"><a class="anchor" href="#che-theia-plug-in-lifecycle_che"></a>Che-Theia plug-in lifecycle</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Every time a user starts a Che workspace, a Che-Theia plug-in life cycle process starts. The steps of this process are as follows:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Che server checks for plug-ins to start from the workspace definition.</p>
</li>
<li>
<p>Che server retrieves plug-in metadata, recognizes each plug-in type, and stores them in memory.</p>
</li>
<li>
<p>Che server selects a broker according to the plug-in type.</p>
</li>
<li>
<p>The broker processes the installation and deployment of the plug-in. The installation process of the plug-in differs for each specific broker.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Plug-ins exist in various types. A broker ensures the success of a plug-in deployment by meeting all installation requirements.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="../_images/extensibility/che-theia-plug-in-lifecycle.svg"><img src="../_images/extensibility/che-theia-plug-in-lifecycle.svg" alt="che theia plug in lifecycle"></a>
</div>
<div class="title">Figure 2. Che-Theia plug-in lifecycle</div>
</div>
<div class="paragraph">
<p>Before a Che workspace is launched, Che server starts the workspace containers:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The Che-Theia plug-in broker extracts the information about sidecar containers that a particular plug-in needs from the <code>.theia</code> file.</p>
</li>
<li>
<p>The broker sends the appropriate container information to Che server.</p>
</li>
<li>
<p>The broker copies the Che-Theia plug-in to a volume to have it available for the Che-Theia editor container.</p>
</li>
<li>
<p>Che server then starts all the containers of the workspace.</p>
</li>
<li>
<p>Che-Theia starts in its container and checks the correct folder to load the plug-ins.</p>
</li>
</ol>
</div>
<div class="olist arabic">
<div class="title">A user experience with Che-Theia plug-in lifecycle</div>
<ol class="arabic">
<li>
<p>When a user opens a browser tab with Che-Theia, Che-Theia starts a new plug-in session with:</p>
<div class="ulist">
<ul>
<li>
<p>Web Worker for frontend</p>
</li>
<li>
<p>Node.js for backend</p>
</li>
</ul>
</div>
</li>
<li>
<p>Che-Theia notifies all Che-Theia plug-ins with the start of the new session by calling the <code>start()</code> function for each triggered plug-in.</p>
</li>
<li>
<p>A Che-Theia plug-in session runs and interacts with the Che-Theia backend and frontend.</p>
</li>
<li>
<p>When the user closes the Che-Theia browser tab, or the session ended on a timeout limit, Che-Theia notifies all plug-ins with the <code>stop()</code> function for each triggered plug-in.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="embedded-and-remote-che-theia-plug-ins_che"><a class="anchor" href="#embedded-and-remote-che-theia-plug-ins_che"></a>Embedded and remote Che-Theia plug-ins</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Developer workspaces in Eclipse&#160;Che provide all dependencies needed to work on a project. The application includes the dependencies needed by all the tools and plug-ins used.</p>
</div>
<div class="paragraph">
<p>Based on the required dependencies, Che-Theia plug-in can run as:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Embedded, also know as local</p>
</li>
<li>
<p>Remote</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="embedded-or-local-plug-ins_che"><a class="anchor" href="#embedded-or-local-plug-ins_che"></a>Embedded (local) plug-ins</h3>
<div class="paragraph">
<p>The Embedded plug-ins are plug-ins without specific dependencies that are injected into the Che-Theia IDE. These plug-ins use the Node.js runtime, which runs in the IDE container.</p>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Code linting</p>
</li>
<li>
<p>New set of commands</p>
</li>
<li>
<p>New UI components</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>To include a Che-Theia plug-in or VS Code extension, define a URL to the plug-in <code>.theia</code> archive binary in the <code>meta.yaml</code> file. See
<a href="../adding-a-vs-code-extension-to-a-workspace/" class="page">Adding a VS Code extension to a workspace</a></p>
</div>
<div class="paragraph">
<p>When starting a workspace, Che downloads and unpacks the plug-in binaries and includes them in the Che-Theia editor container. The Che-Theia editor initializes the plug-ins when it starts.</p>
</div>
</div>
<div class="sect2">
<h3 id="remote-plug-ins_che"><a class="anchor" href="#remote-plug-ins_che"></a>Remote plug-ins</h3>
<div class="paragraph">
<p>The plug-in relies on dependencies or it has a back end. It runs in its own sidecar container, and all dependencies are packaged in the container.</p>
</div>
<div class="paragraph">
<p>A remote Che-Theia plug-in consist of two parts:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Che-Theia plug-in or VS Code extension binaries. The definition in the <code>meta.yaml</code> file is the same as for embedded plug-ins.</p>
</li>
<li>
<p>Container image definition, for example, <code>eclipse/che-theia-dev:nightly</code>. From this image, Che creates a separate container inside a workspace.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Examples:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Java Language Server</p>
</li>
<li>
<p>Python Language Server</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>When starting a workspace, Che creates a container from the plug-in image, downloads and unpacks the plug-in binaries, and includes them in the created container. The Che-Theia editor connects to the remote plug-ins when it starts.</p>
</div>
</div>
<div class="sect2">
<h3 id="_comparison_matrix"><a class="anchor" href="#_comparison_matrix"></a>Comparison matrix</h3>
<div class="ulist">
<ul>
<li>
<p>Embedded plug-ins are those Che-Theia plug-ins or VS Code extensions that do not require extra dependencies inside its container.</p>
</li>
<li>
<p>Remote plug-ins are containers that contain a plug-in with all required dependencies.</p>
</li>
</ul>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 11. Che-Theia plug-in comparison matrix: embedded vs remote</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"></th>
<th class="tableblock halign-left valign-top">Configure RAM per plug-in</th>
<th class="tableblock halign-left valign-top">Environment dependencies</th>
<th class="tableblock halign-left valign-top">Create separated container</th>
</tr>
</thead>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">Remote</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock">TRUE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-in uses dependencies defined in the remote container.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TRUE</p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">Embedded</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock">FALSE (users can configure RAM for the whole editor container, but not per plug-in)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Plug-in uses dependencies from the editor container; if container does not include these dependencies, the plug-in fails or does not function as expected.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FALSE</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Depending on your use case and the capabilities provided by your plug-in, select one of the described running modes.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="remote-plug-in-endpoint_che"><a class="anchor" href="#remote-plug-in-endpoint_che"></a>Remote plug-in endpoint</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse&#160;Che has a remote plug-in endpoint service to start VS Code Extensions and Che-Theia plug-ins in separate containers. Eclipse&#160;Che injects the remote plug-in endpoint binaries into each remote plug-in container. This service starts remote extensions and plug-ins defined in the plug-in <code>meta.yaml</code> file and connects them to the Che-Theia editor container.</p>
</div>
<div class="paragraph">
<p>The remote plug-in endpoint creates a plug-in API proxy between the remote plug-in container and the Che-Theia editor container. The remote plug-in endpoint is also an interceptor for some plug-in API parts, which it launches inside a remote sidecar container rather than an editor container. Examples: terminal API, debug API.</p>
</div>
<div class="paragraph">
<p>The remote plug-in endpoint executable command is stored in the environment variable of the remote plug-in container: <code>PLUGIN_REMOTE_ENDPOINT_EXECUTABLE</code>.</p>
</div>
<div class="paragraph">
<p>Eclipse&#160;Che provides two ways to start the remote plug-in endpoint with a sidecar image:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Defining a <code>launch</code> remote plug-in endpoint using a Dockerfile. To use this method, patch an original image and rebuild it.</p>
</li>
<li>
<p>Defining a <code>launch</code> remote plug-in endpoint in the plug-in <code>meta.yaml</code> file. Use this method to avoid patching an original image.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="defining-a-launch-remote-plug-in-endpoint-using-dockerfile_che"><a class="anchor" href="#defining-a-launch-remote-plug-in-endpoint-using-dockerfile_che"></a>Defining a <code>launch</code> remote plug-in endpoint using Dockerfile</h3>
<div class="paragraph">
<p>To start a remote plug-in endpoint, set the <code>PLUGIN_REMOTE_ENDPOINT_EXECUTABLE</code> environment variable in the Dockerfile.</p>
</div>
<div class="ulist">
<div class="title">Procedure</div>
<ul>
<li>
<p>Start a remote plug-in endpoint using the <code>CMD</code> command in the Dockerfile:</p>
<div class="listingblock">
<div class="title">Dockerfile example</div>
<div class="content">
<pre class="highlightjs highlight"><code>FROM fedora:30
RUN dnf update -y &amp;&amp; dnf install -y nodejs htop &amp;&amp; node -v
RUN mkdir /home/user
ENV HOME=/home/user
RUN mkdir /projects \
&amp;&amp; chmod -R g+rwX /projects \
&amp;&amp; chmod -R g+rwX "${HOME}"
CMD ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre>
</div>
</div>
</li>
<li>
<p>Start a remote plug-in endpoint using the <code>ENTRYPOINT</code> command in the Dockerfile:</p>
<div class="listingblock">
<div class="title">Dockerfile example</div>
<div class="content">
<pre class="highlightjs highlight"><code>FROM fedora:30
RUN dnf update -y &amp;&amp; dnf install -y nodejs htop &amp;&amp; node -v
RUN mkdir /home/user
ENV HOME=/home/user
RUN mkdir /projects \
&amp;&amp; chmod -R g+rwX /projects \
&amp;&amp; chmod -R g+rwX "${HOME}"
ENTRYPOINT ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre>
</div>
</div>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="_using_a_wrapper_script"><a class="anchor" href="#_using_a_wrapper_script"></a>Using a wrapper script</h4>
<div class="paragraph">
<p>Some images use a wrapper script to configure permissions inside the container. The Dockertfile <code>ENTRYPOINT</code> command defines this script, which executes the main process defined in the <code>CMD</code> command of the Dockerfile.</p>
</div>
<div class="paragraph">
<p>Eclipse&#160;Che uses images with a wrapper script to provide permission configurations to different infrastructures protected by advanced security. OpenShift&#160;Container&#160;Platform is an example of such an infrastructure.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Example of a wrapper script:</p>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">#!/bin/sh
set -e
export USER_ID=$(id -u)
export GROUP_ID=$(id -g)
if ! whoami &gt;/dev/null 2&gt;&amp;1; then
echo "${USER_NAME:-user}:x:${USER_ID}:0:${USER_NAME:-user} user:${HOME}:/bin/sh" &gt;&gt; /etc/passwd
fi
# Grant access to projects volume in case of non root user with sudo rights
if [ "${USER_ID}" -ne 0 ] &amp;&amp; command -v sudo &gt;/dev/null 2&gt;&amp;1 &amp;&amp; sudo -n true &gt; /dev/null 2&gt;&amp;1; then
sudo chown "${USER_ID}:${GROUP_ID}" /projects
fi
exec "$@"</code></pre>
</div>
</div>
</li>
<li>
<p>Example of a Dockerfile with a wrapper script:</p>
<div class="listingblock">
<div class="title">Dockerfile example</div>
<div class="content">
<pre class="highlightjs highlight"><code>FROM alpine:3.10.2
ENV HOME=/home/theia
RUN mkdir /projects ${HOME} &amp;&amp; \
# Change permissions to let any arbitrary user
for f in "${HOME}" "/etc/passwd" "/projects"; do \
echo "Changing permissions on ${f}" &amp;&amp; chgrp -R 0 ${f} &amp;&amp; \
chmod -R g+rwX ${f}; \
done
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]
CMD ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre>
</div>
</div>
<div class="exampleblock">
<div class="content">
<div class="ulist">
<div class="title">Explanation:</div>
<ul>
<li>
<p>The container launches the <code>/entrypoint.sh</code> script defined in the <code>ENTRYPOINT</code> command of the Dockerfile.</p>
</li>
<li>
<p>The script configures the permissions and executes the command using <code>exec $@</code>.</p>
</li>
<li>
<p><code>CMD</code> is the argument for <code>ENTRYPOINT</code>, and the <code>exec $@</code> command calls <code>${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code>.</p>
</li>
<li>
<p>The remote plug-in endpoint then starts in the container after permission configuration.</p>
</li>
</ul>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="defining-a-launch-remote-plug-in-endpoint-in-a-meta-yaml-file_che"><a class="anchor" href="#defining-a-launch-remote-plug-in-endpoint-in-a-meta-yaml-file_che"></a>Defining a <code>launch</code> remote plug-in endpoint in a <code>meta.yaml</code> file</h3>
<div class="paragraph">
<p>Use this method to re-use images for starting a remote plug-in endpoint without any modifications.</p>
</div>
<div class="paragraph">
<div class="title">Procedure</div>
<p>Modify the plug-in <code>meta.yaml</code> file properties <code>command</code> and <code>args</code>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>command</code> - Eclipse&#160;Che uses the <code>command</code> properties to override the <code>Dockerfile#ENTRYPOINT</code> value.</p>
</li>
<li>
<p><code>args</code> - Eclipse&#160;Che uses uses the <code>args</code> properties to override the <code>Dockerfile#CMD</code> value.</p>
</li>
<li>
<p>Example of a YAML file with the <code>command</code> and <code>args</code> properties modified:</p>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2
category: Language
description: "Typescript language features"
displayName: Typescript
firstPublicationDate: "2019-10-28"
icon: "https://www.eclipse.org/che/images/logo-eclipseche.svg"
name: typescript
publisher: che-incubator
repository: "https://github.com/Microsoft/vscode"
title: "Typescript language features"
type: "VS Code extension"
version: remote-bin-with-override-entrypoint
spec:
containers:
- image: "example/fedora-for-ts-remote-plugin-without-endpoint:latest"
memoryLimit: 512Mi
name: vscode-typescript
command:
- sh
- -c
args:
- ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}
extensions:
- "https://github.com/che-incubator/ms-code.typescript/releases/download/v1.35.1/che-typescript-language-1.35.1.vsix"</code></pre>
</div>
</div>
</li>
<li>
<p>Modify <code>args</code> instead of <code>command</code> to use an image with a wrapper script pattern and to keep a call of the <code>entrypoint.sh</code> script:</p>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2
category: Language
description: "Typescript language features"
displayName: Typescript
firstPublicationDate: "2019-10-28"
icon: "https://www.eclipse.org/che/images/logo-eclipseche.svg"
name: typescript
publisher: che-incubator
repository: "https://github.com/Microsoft/vscode"
title: "Typescript language features"
type: "VS Code extension"
version: remote-bin-with-override-entrypoint
spec:
containers:
- image: "example/fedora-for-ts-remote-plugin-without-endpoint:latest"
memoryLimit: 512Mi
name: vscode-typescript
args:
- sh
- -c
- ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}
extensions:
- "https://github.com/che-incubator/ms-code.typescript/releases/download/v1.35.1/che-typescript-language-1.35.1.vsix"</code></pre>
</div>
</div>
<div class="paragraph">
<p>Eclipse&#160;Che calls the <code>entrypoint.sh</code> wrapper script defined in the <code>ENTRYPOINT</code> command of the Dockerfile. The script executes <code>[ ‘sh’, ‘-c”, ‘ ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}’ ]</code> using the <code>exec “$@”</code> command.</p>
</div>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="ulist">
<div class="title">By modifying the <code>command</code> and <code>args</code> properties of the <code>meta.yaml</code> file, a user can:</div>
<ul>
<li>
<p>Execute a service at a container start</p>
</li>
<li>
<p>Start a remote plug-in endpoint</p>
</li>
</ul>
</div>
<div class="olist arabic">
<div class="title">To make these actions run at the same time:</div>
<ol class="arabic">
<li>
<p>Start the service.</p>
</li>
<li>
<p>Detach the process.</p>
</li>
<li>
<p>Start the remote plug-in endpoint.</p>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</article>
</div>
</main>
</div>
<footer class="footer">
<div><a href="https://www.eclipse.org" target="_blank">Eclipse Foundation</a> |
<a href="https://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a> |
<a href="https://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a> |
<a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">Eclipse Public License</a> |
<a href="https://www.eclipse.org/legal" target="_blank">Legal Resources</a></div>
</footer>
<script src="../../../_/js/site.js"></script>
<script async src="../../../_/js/vendor/highlight.js"></script>
</body>
</html>