Créer un fournisseur de connexion pour une extension de solution
Les fournisseurs de connexion jouent un rôle important dans la façon dont Windows Admin Center définit et communique avec des objets ou des cibles connectables. Principalement, un fournisseur de connexion effectue des actions pendant qu’une connexion est établie, comme s’assurer que la cible est en ligne et disponible, et s’assurer que l’utilisateur qui se connecte a l’autorisation d’accéder à la cible.
Par défaut, Windows Admin Center est fourni avec les fournisseurs de connexion suivants :
- Serveur
- Client Windows
- Cluster de basculement
- Cluster HCI
Pour créer votre propre fournisseur de connexion personnalisé, procédez comme suit :
- Ajouter les détails du fournisseur de connexion à
manifest.json
- Définir le fournisseur d’état de connexion
- Implémenter le fournisseur de connexion dans la couche Application
Ajouter les détails du fournisseur de connexion à manifest.json
Nous allons maintenant passer en revue ce que vous devez savoir pour définir un fournisseur de connexion dans le fichier manifest.json
de votre projet.
Créer une entrée dans manifest.json
Le fichier manifest.json
se trouve dans le dossier \src et contient, entre autres, des définitions de points d’entrée dans votre projet. Les types de points d’entrée incluent outils, solutions et fournisseurs de connexion. Nous allons définir un fournisseur de connexion.
Voici un exemple d’entrée fournisseur de connexion dans manifest.json :
{
"entryPointType": "connectionProvider",
"name": "addServer",
"path": "/add",
"displayName": "resources:strings:addServer_displayName",
"icon": "sme-icon:icon-win-server",
"description": "resources:strings:description",
"connectionType": "msft.sme.connection-type.server",
"connectionTypeName": "resources:strings:addServer_connectionTypeName",
"connectionTypeUrlName": "server",
"connectionTypeDefaultSolution": "msft.sme.server-manager!servers",
"connectionTypeDefaultTool": "msft.sme.server-manager!overview",
"connectionStatusProvider": {
"powerShell": {
"script": "## Get-My-Status ##\nfunction Get-Status()\n{\n# A function like this would be where logic would exist to identify if a node is connectable.\n$status = @{label = $null; type = 0; details = $null; }\n$caption = \"MyConstCaption\"\n$productType = \"MyProductType\"\n# A result object needs to conform to the following object structure to be interpreted properly by the Windows Admin Center shell.\n$result = @{ status = $status; caption = $caption; productType = $productType; version = $version }\n# DO FANCY LOGIC #\n# Once the logic is complete, the following fields need to be populated:\n$status.label = \"Display Thing\"\n$status.type = 0 # This value needs to conform to the LiveConnectionStatusType enum. >= 3 represents a failure.\n$status.details = \"success stuff\"\nreturn $result}\nGet-Status"
},
"displayValueMap": {
"wmfMissing-label": "resources:strings:addServer_status_wmfMissing_label",
"wmfMissing-details": "resources:strings:addServer_status_wmfMissing_details",
"unsupported-label": "resources:strings:addServer_status_unsupported_label",
"unsupported-details": "resources:strings:addServer_status_unsupported_details"
}
}
},
Un point d’entrée de type « connnectionProvider » indique à l’interpréteur de commandes Windows Admin Center que l’élément en cours de configuration est un fournisseur qui sera utilisé par une solution pour valider un état de connexion. Les points d’entrée du fournisseur de connexion contiennent un certain nombre de propriétés importantes, définies ci-dessous :
Propriété | Description |
---|---|
entryPointType | Cette propriété est obligatoire. Il existe trois valeurs valides : « tool », « solution » et « connectionProvider ». |
name | Identifie le fournisseur de connexion dans l’étendue d’une solution. Cette valeur doit être unique à l’intérieur d’une instance Windows Admin Center complète (pas seulement une solution). |
path | Représente le chemin d’URL de l’interface utilisateur « Ajouter une connexion », si elle est configurée par la solution. Cette valeur doit être mappée à un itinéraire configuré dans le fichier app-routing.module.ts. Lorsque le point d’entrée de la solution est configuré pour utiliser les connexions rootNavigationBehavior, cet itinéraire charge le module utilisé par l’interpréteur de commandes pour afficher l’interface utilisateur Ajouter une connexion. Plus d’informations sont disponibles dans la section sur rootNavigationBehavior. |
displayName | La valeur entrée ici s’affiche sur le côté droit de l’interpréteur de commandes, sous la barre de Windows Admin Center noire lorsqu’un utilisateur charge la page de connexions d’une solution. |
icon | Représente l’icône utilisée dans le menu déroulant Solutions pour représenter la solution. |
description | Entrez une brève description du point d’entrée. |
connectionType | Représente le type de connexion que le fournisseur va charger. La valeur entrée ici sera également utilisée dans le point d’entrée de la solution pour spécifier que la solution peut charger ces connexions. La valeur entrée ici sera également utilisée dans le ou les points d’entrée de l’outil pour indiquer que l’outil est compatible avec ce type. Cette valeur entrée ici sera également utilisée dans l’objet de connexion soumis à l’appel RPC sur la « fenêtre Ajouter », à l’étape d’implémentation de la couche Application. |
connectionTypeName | Utilisé dans la table connections pour représenter une connexion qui utilise votre fournisseur de connexion. Il s’agit normalement du nom pluriel du type. |
connectionTypeUrlName | Utilisé lors de la création de l’URL pour représenter la solution chargée, une fois Windows Admin Center s’est connecté à une instance. Cette entrée est utilisée après les connexions et avant la cible. Dans cet exemple, « connectionexample » est l’emplacement où cette valeur apparaît dans l’URL : http://localhost:6516/solutionexample/connections/connectionexample/con-fake1.corp.contoso.com |
connectionTypeDefaultSolution | Représente le composant par défaut qui doit être chargé par le fournisseur de connexion. Cette valeur est une combinaison des éléments suivants : [a] Nom du package d’extension défini en haut du manifeste ; [b] Le point d'exclamation (!) ; [c] Nom du point d’entrée de la solution. Pour un projet avec le nom « msft.sme.mySample-extension » et un point d’entrée de solution avec le nom « example », cette valeur serait « msft.sme.solutionExample-extension!example ». |
connectionTypeDefaultTool | Représente l’outil par défaut qui doit être chargé lors d’une connexion réussie. Cette valeur de propriété est composée de deux parties, similaires à connectionTypeDefaultSolution. Cette valeur est une combinaison des éléments suivants : [a] Nom du package d’extension défini en haut du manifeste ; [b] Le point d'exclamation (!) ; [c] Nom du point d’entrée de l’outil qui doit être chargé initialement. Pour un projet portant le nom « msft.sme.solutionExample-extension » et un point d’entrée de solution avec le nom « example », cette valeur est « msft.sme.solutionExample-extension!example ». |
connectionStatusProvider | Consultez la section « Définir le fournisseur d’état de connexion » |
Définir le fournisseur d’état de connexion
Le fournisseur d’état de connexion est le mécanisme par lequel une cible est validée pour être en ligne et disponible, garantissant également que l’utilisateur qui se connecte a l’autorisation d’accéder à la cible. Il existe actuellement deux types de fournisseurs d’état de connexion : PowerShell et RelativeGatewayUrl.
- Fournisseur d’état de connexion PowerShell : détermine si une cible est en ligne et accessible avec un script PowerShell. Le résultat doit être retourné dans un objet avec une propriété unique « status », définie ci-dessous.
- Fournisseur d’état de connexion RelativeGatewayUrl : détermine si une cible est en ligne et accessible à l’aide d’un appel Rest. Le résultat doit être retourné dans un objet avec une propriété unique « status », définie ci-dessous.
Définir l’État
Les fournisseurs d’état de connexion sont requis pour retourner un objet avec une propriété unique status
conforme au format suivant :
{
status: {
label: string;
type: int;
details: string;
}
}
Propriétés d’état :
Étiquette : étiquette décrivant le type de retour d’état. Notez que les valeurs d’étiquette peuvent être mappées dans l’exécution. Consultez l’entrée ci-dessous pour connaître les valeurs de mappage dans l’exécution.
Type : type de retour d’état. Type a les valeurs d’énumération suivantes. Pour toute valeur 2 ou supérieure, la plateforme n’accède pas à l’objet connecté et une erreur s’affiche dans l’interface utilisateur.
Types :
Valeur Description 0 En ligne 1 Warning 2 Non autorisé 3 Error 4 Erreur irrécupérable 5 Unknown Détails : détails supplémentaires décrivant le type de retour d’état.
Script du fournisseur d’état de connexion PowerShell
Le script PowerShell du fournisseur d’état de connexion détermine si une cible est en ligne et accessible à l’aide d’un script PowerShell. Le résultat doit être retourné dans un objet avec une propriété unique « Status ». Vous trouverez ci-dessous un exemple de script.
Exemple de script PowerShell :
## Get-My-Status ##
function Get-Status()
{
# A function like this would be where logic would exist to identify if a node is connectable.
$status = @{label = $null; type = 0; details = $null; }
$caption = "MyConstCaption"
$productType = "MyProductType"
# A result object needs to conform to the following object structure to be interperated properly by the Windows Admin Center shell.
$result = @{ status = $status; caption = $caption; productType = $productType; version = $version }
# DO FANCY LOGIC #
# Once the logic is complete, the following fields need to be populated:
$status.label = "Display Thing"
$status.type = 0 # This value needs to conform to the LiveConnectionStatusType enum. >= 3 represents a failure.
$status.details = "success stuff"
return $result
}
Get-Status
Définir la méthode fournisseur d’état de connexion RelativeGatewayUrl
La méthode Fournisseur d’état de connexionRelativeGatewayUrl
appelle une API rest pour déterminer si une cible est en ligne et accessible. Le résultat doit être retourné dans un objet avec une propriété unique « Status ». Un exemple d’entrée fournisseur de connexion dans manifest.json d’un RelativeGatewayUrl est illustré ci-dessous.
{
"entryPointType": "connectionProvider",
"name": "addServer",
"path": "/add/server",
"displayName": "resources:strings:addServer_displayName",
"icon": "sme-icon:icon-win-server",
"description": "resources:strings:description",
"connectionType": "msft.sme.connection-type.server",
"connectionTypeName": "resources:strings:addServer_connectionTypeName",
"connectionTypeUrlName": "server",
"connectionTypeDefaultSolution": "msft.sme.server-manager!servers",
"connectionTypeDefaultTool": "msft.sme.server-manager!overview",
"connectionStatusProvider": {
"relativeGatewayUrl": "<URL here post /api>",
"displayValueMap": {
"wmfMissing-label": "resources:strings:addServer_status_wmfMissing_label",
"wmfMissing-details": "resources:strings:addServer_status_wmfMissing_details",
"unsupported-label": "resources:strings:addServer_status_unsupported_label",
"unsupported-details": "resources:strings:addServer_status_unsupported_details"
}
}
},
Remarques sur l’utilisation de RelativeGatewayUrl :
- « relativeGatewayUrl » spécifie où obtenir l’état de la connexion à partir d’une URL de passerelle. Cet URI est relatif à partir de /api. Si $connectionName est trouvé dans l’URL, elle est remplacée par le nom de la connexion.
- Toutes les propriétés relativeGatewayUrl doivent être exécutées sur la passerelle hôte, ce qui peut être réalisé en créant une extension de passerelle
Mapper des valeurs dans le runtime
Les valeurs d’étiquette et de détails de l’objet de retour d’état peuvent être mises en forme au moment de l’optimisation en incluant les clés et les valeurs dans la propriété « defaultValueMap » du fournisseur.
Par exemple, si vous ajoutez la valeur ci-dessous, chaque fois que « defaultConnection_test » s’affiche en tant que valeur pour l’étiquette ou les détails, Windows Admin Center remplacera automatiquement la clé par la valeur de chaîne de ressource configurée.
"defaultConnection_test": "resources:strings:addServer_status_defaultConnection_label"
Implémenter le fournisseur de connexion dans la couche Application
Nous allons maintenant implémenter le fournisseur de connexion dans la couche application, en créant une classe TypeScript qui implémente OnInit. La classe possède les fonctions suivantes :
Fonction | Description |
---|---|
constructeur(private appContextService : AppContextService, itinéraire privé : ActivatedRoute) | |
public ngOnInit() | |
public onSubmit() | Contient la logique de mise à jour de l’interpréteur de commandes lorsqu’une tentative d’ajout de connexion est effectuée |
public onCancel() | Contient la logique de mise à jour de l’interpréteur de commandes lorsqu’une tentative d’ajout de connexion est annulée |
Définir onSubmit
onSubmit
émet un rappel RPC au contexte de l’application pour notifier l’interpréteur de commandes d’une « Ajouter une connexion ». L’appel de base utilise « updateData » comme suit :
this.appContextService.rpc.updateData(
EnvironmentModule.nameOfShell,
'##',
<RpcUpdateData>{
results: {
connections: connections,
credentials: this.useCredentials ? this.creds : null
}
}
);
Le résultat est une propriété de connexion, qui est un tableau d’objets conformes à la structure suivante :
/**
* The connection attributes class.
*/
export interface ConnectionAttribute {
/**
* The id string of this attribute
*/
id: string;
/**
* The value of the attribute. used for attributes that can have variable values such as Operating System
*/
value?: string | number;
}
/**
* The connection class.
*/
export interface Connection {
/**
* The id of the connection, this is unique per connection
*/
id: string;
/**
* The type of connection
*/
type: string;
/**
* The name of the connection, this is unique per connection type
*/
name: string;
/**
* The property bag of the connection
*/
properties?: ConnectionProperties;
/**
* The ids of attributes identified for this connection
*/
attributes?: ConnectionAttribute[];
/**
* The tags the user(s) have assigned to this connection
*/
tags?: string[];
}
/**
* Defines connection type strings known by core
* Be careful that these strings match what is defined by the manifest of @msft-sme/server-manager
*/
export const connectionTypeConstants = {
server: 'msft.sme.connection-type.server',
cluster: 'msft.sme.connection-type.cluster',
hyperConvergedCluster: 'msft.sme.connection-type.hyper-converged-cluster',
windowsClient: 'msft.sme.connection-type.windows-client',
clusterNodesProperty: 'nodes'
};
Définir onCancel
onCancel
annule une tentative « Ajouter une connexion » en passant un tableau de connexions vide :
this.appContextService.rpc.updateData(EnvironmentModule.nameOfShell, '##', <RpcUpdateData>{ results: { connections: [] } });
Exemple de fournisseur de connexion
La classe TypeScript complète pour l’implémentation d’un fournisseur de connexion est ci-dessous. Notez que la chaîne « connectionType » correspond au « connectionType tel que défini dans le fournisseur de connexion dans manifest.json.
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { AppContextService } from '@microsoft/windows-admin-center-sdk/shell/angular';
import { Connection, ConnectionUtility } from '@microsoft/windows-admin-center-sdk/shell/core';
import { EnvironmentModule } from '@microsoft/windows-admin-center-sdk/shell/dist/core/manifest/environment-modules';
import { RpcUpdateData } from '@microsoft/windows-admin-center-sdk/shell/dist/core/rpc/rpc-base';
import { Strings } from '../../generated/strings';
@Component({
selector: 'add-example',
templateUrl: './add-example.component.html',
styleUrls: ['./add-example.component.css']
})
export class AddExampleComponent implements OnInit {
public newConnectionName: string;
public strings = MsftSme.resourcesStrings<Strings>().SolutionExample;
private connectionType = 'msft.sme.connection-type.example'; // This needs to match the connectionTypes value used in the manifest.json.
constructor(private appContextService: AppContextService, private route: ActivatedRoute) {
// TODO:
}
public ngOnInit() {
// TODO
}
public onSubmit() {
let connections: Connection[] = [];
let connection = <Connection> {
id: ConnectionUtility.createConnectionId(this.connectionType, this.newConnectionName),
type: this.connectionType,
name: this.newConnectionName
};
connections.push(connection);
this.appContextService.rpc.updateData(
EnvironmentModule.nameOfShell,
'##',
<RpcUpdateData> {
results: {
connections: connections,
credentials: null
}
}
);
}
public onCancel() {
this.appContextService.rpc.updateData(
EnvironmentModule.nameOfShell, '##', <RpcUpdateData>{ results: { connections: [] } });
}
}