Criar um provedor de conexão para uma extensão de solução
Os Provedores de Conexão desempenham um papel importante na forma como o Windows Admin Center define e se comunica com objetos conectáveis, ou destinos. Em princípio, um Provedor de Conexão executa ações enquanto uma conexão está sendo feita, como garantir que o destino esteja online e disponível e também garantir que o usuário conectado tenha permissão para acessar o destino.
Por padrão, o Windows Admin Center é fornecido com os seguintes Provedores de Conexão:
- Servidor
- Windows Client
- Cluster de failover
- Cluster HCI
Para criar seu Provedor de Conexão personalizado, siga estas etapas:
- Adicionar detalhes do Provedor de Conexão a
manifest.json
- Definir o provedor de status de conexão
- Implementar o Provedor de Conexão na camada de aplicativo
Adicionar detalhes do Provedor de Conexão a manifest.json
Agora, vamos examinar o que você precisa saber para definir um Provedor de Conexão no arquivo manifest.json
do projeto.
Criar entrada em manifest.json
O arquivo manifest.json
está localizado na pasta \src e contém, entre outras coisas, definições de pontos de entrada no projeto. Os tipos de pontos de entrada incluem Ferramentas, Soluções e Provedores de Conexão. Definiremos um Provedor de Conexão.
Um exemplo de entrada de Provedor de Conexão em manifest.json está abaixo:
{
"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"
}
}
},
Um ponto de entrada do tipo "connnectionProvider" indica ao shell do Windows Admin Center que o item que está sendo configurado é um provedor que será usado por uma Solução para validar um estado de conexão. Os pontos de entrada do Provedor de Conexão contêm várias propriedades importantes, definidas abaixo:
Propriedade | Descrição |
---|---|
entryPointType | Esta é uma propriedade obrigatória. Há três valores válidos: "tool", "solution" e "connectionProvider". |
name | Identifica o Provedor de Conexão dentro do escopo de uma Solução. Esse valor precisa ser exclusivo dentro de uma instância do Windows Admin Center completa (não apenas uma Solução). |
caminho | Representa o caminho da URL para a interface do usuário "Adicionar Conexão", se ela for ser configurada pela Solução. Esse valor precisa ser mapeado para uma rota configurada no arquivo app-routing.module.ts. Quando o ponto de entrada de Solução estiver configurado para usar o rootNavigationBehavior das conexões, essa rota carregará o módulo usado pelo Shell para exibir a interface do usuário Adicionar Conexão. Mais informações estão disponíveis na seção sobre rootNavigationBehavior. |
displayName | O valor inserido aqui é exibido no lado direito do shell, abaixo da barra preta do Windows Admin Center, quando um usuário carrega a página de conexões de uma Solução. |
ícone | Representa o ícone usado no menu suspenso Soluções para representar a Solução. |
descrição | Insira uma breve descrição do ponto de entrada. |
connectionType | Representa o tipo de conexão que o provedor carregará. O valor inserido aqui também será usado no ponto de entrada da Solução para especificar que a Solução pode carregar essas conexões. O valor inserido aqui também será usado nos Pontos de entrada da ferramenta para indicar que a Ferramenta é compatível com esse tipo. O valor inserido aqui também será usado no objeto de conexão enviado à chamada RPC na "Janela Adicionar", na etapa de implementação da camada de aplicativo. |
connectionTypeName | Usado na tabela de conexões para representar uma conexão que usa o Provedor de Conexão. Espera-se que esse seja o nome plural do tipo. |
connectionTypeUrlName | Usado na criação da URL para representar a Solução carregada, depois que o Windows Admin Center se conectou a uma instância. Essa entrada é usada após as conexões e antes do destino. Neste exemplo, "connectionexample" é onde esse valor aparece na URL: http://localhost:6516/solutionexample/connections/connectionexample/con-fake1.corp.contoso.com |
connectionTypeDefaultSolution | Representa o componente padrão que deve ser carregado pelo Provedor de Conexão. Esse valor é uma combinação de: [a] O nome do pacote de extensão definido na parte superior do manifesto; [b] Ponto de exclamação (!); [c] O nome do ponto de entrada da Solução. Para um projeto com o nome "msft.sme.mySample-extension" e um ponto de entrada da Solução com o nome "example", esse valor seria "msft.sme.solutionExample-extension!example". |
connectionTypeDefaultTool | Representa a Ferramenta padrão que deve ser carregada em uma conexão bem-sucedida. Esse valor de propriedade é composto por duas partes, semelhante a connectionTypeDefaultSolution. Esse valor é uma combinação de: [a] O nome do pacote de extensão definido na parte superior do manifesto; [b] Ponto de exclamação (!); [c] O nome do ponto de entrada da Ferramenta que deve ser carregado inicialmente. Para um projeto com o nome "msft.sme.solutionExample-extension" e um ponto de entrada da Solução com o nome "example", esse valor seria "msft.sme.solutionExample-extension!example". |
connectionStatusProvider | Consulte a seção "Definir o Provedor de Status de Conexão" |
Definir o Provedor de Status de Conexão
O Provedor de Status de Conexão é o mecanismo pelo qual um destino é validado como estando online e disponível, garantindo também que o usuário conectado tenha permissão para acessar o destino. Atualmente, há dois tipos de Provedores de Status de Conexão: PowerShell e RelativeGatewayUrl.
- Provedor de Status de Conexão do PowerShell – determina se um destino está online e acessível com um script do PowerShell. O resultado deve ser retornado em um objeto com uma propriedade "status", definida abaixo.
- Provedor de Status de Conexão RelativeGatewayUrl – determina se um destino está online e acessível com uma chamada rest. O resultado deve ser retornado em um objeto com uma propriedade "status", definida abaixo.
Definir o status
Os Provedores de Status de Conexão precisam retornar um objeto com uma propriedade status
que esteja em conformidade com o seguinte formato:
{
status: {
label: string;
type: int;
details: string;
}
}
Propriedades de status:
Rótulo – um rótulo que descreve o tipo de retorno de status. Observe que os valores do rótulo podem ser mapeados em runtime. Consulte a entrada abaixo para obter os valores de mapeamento em runtime.
Tipo – o tipo de retorno de status. O tipo tem os valores de enumeração a seguir. Para qualquer valor 2 ou superior, a plataforma não navegará até o objeto conectado e um erro será exibido na interface do usuário.
Tipos:
Valor Descrição 0 Online 1 Aviso 2 Não Autorizado 3 Erro 4 Fatal 5 Unknown Detalhes – detalhes adicionais que descrevem o tipo de retorno de status.
Script do Provedor de Status de Conexão do PowerShell
O script do PowerShell do Provedor de Status de Conexão determina se um destino está online e acessível com um script do PowerShell. O resultado deve ser retornado em um objeto com uma propriedade "status". Um script de exemplo é mostrado abaixo.
Exemplo de script do 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
Definir o método RelativeGatewayUrl do Profissional de Status de Conexão
O método RelativeGatewayUrl
do Provedor de Status de Conexão chama uma API rest para determinar se um destino está online e acessível. O resultado deve ser retornado em um objeto com uma propriedade "status". Um exemplo de entrada de Provedor de Conexão no manifest.json de um RelativeGatewayUrl é mostrado abaixo.
{
"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"
}
}
},
Observações sobre o uso de RelativeGatewayUrl:
- "relativeGatewayUrl" especifica onde obter o status da conexão de uma URL de gateway. Esse URI é relativo a /api. Se $connectionName for encontrado na URL, ele será substituído pelo nome da conexão.
- Todas as propriedades relativeGatewayUrl precisam ser executadas no gateway de host, o que pode ser feito criando uma extensão de gateway
Mapear valores no runtime
Os valores de rótulo e detalhes no objeto de retorno de status podem ser formatados no momento do ajuste, incluindo chaves e valores na propriedade "defaultValueMap" do provedor.
Por exemplo, se você adicionar o valor abaixo, sempre que "defaultConnection_test" aparecer como um valor para rótulo ou detalhes, o Windows Admin Center substituirá automaticamente a chave pelo valor de cadeia de caracteres de recurso configurado.
"defaultConnection_test": "resources:strings:addServer_status_defaultConnection_label"
Implementar o Provedor de Conexão na camada de aplicativo
Agora, vamos implementar o Provedor de Conexão na camada de aplicativo, criando uma classe TypeScript que implementa OnInit. A classe tem as seguintes funções:
Função | Descrição |
---|---|
constructor(private appContextService: AppContextService, private route: ActivatedRoute) | |
public ngOnInit() | |
public onSubmit() | Contém lógica para atualizar o shell quando uma tentativa de adicionar uma conexão é feita |
public onCancel() | Contém lógica para atualizar o shell quando uma tentativa de adicionar uma conexão é cancelada |
Definir onSubmit
onSubmit
emite uma chamada RPC de volta ao contexto do aplicativo para notificar o shell de "Adicionar Conexão". A chamada básica usa "updateData" da seguinte maneira:
this.appContextService.rpc.updateData(
EnvironmentModule.nameOfShell,
'##',
<RpcUpdateData>{
results: {
connections: connections,
credentials: this.useCredentials ? this.creds : null
}
}
);
O resultado é uma propriedade de conexão, que é uma matriz de objetos que estão em conformidade com a seguinte estrutura:
/**
* 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'
};
Definir onCancel
onCancel
cancela uma tentativa de "Adicionar Conexão" passando uma matriz de conexões vazia:
this.appContextService.rpc.updateData(EnvironmentModule.nameOfShell, '##', <RpcUpdateData>{ results: { connections: [] } });
Exemplo do Provedor de Conexão
A classe TypeScript completa para implementar um provedor de conexão está abaixo. Observe que a cadeia de caracteres "connectionType" corresponde ao "connectionType" conforme definido no provedor de conexão em 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: [] } });
}
}