• Nenhum resultado encontrado

Estratégia baseada em web services REST e SOAP

3.3 COMPOSIÇÃO DAS ESTRATÉGIAS

3.3.1 Mapeamento e Desenvolvimento

3.3.1.2 Estratégia baseada em web services REST e SOAP

O desenvolvimento das aplicações baseadas em web services REST e SOAP seguiu os preceitos estabelecidos pelas arquiteturas ROA e SOA, respectivamente.

Para a composição dos web services REST foi necessário dividir as tarefas, apresentadas no quadro 1 da sessão 3.2, em recursos. Valendo-se da ideia de que os recursos não são os dados em si, mas sim uma informação abstrata de uma entidade (aqui, um dispositivo de rede), agrupou-se essas tarefas em quatro recursos, sendo eles: configuração,

VLAN, tabela de roteamento estático e interface. A exposição do estado atual ou desejado

desses recursos foi definida através da utilização de representações no formato JSON, ocultando assim aspectos internos da sua implementação. Já as referências a essas representações são realizadas através de URIs que nomeiam esses recursos. O quadro 13

apresenta a transformação dessas tarefas de gerência de configuração em web services REST. As tarefas não listadas nesse quadro são encontradas no APÊNDICE C.

Quadro 13 – Tarefas de gerência de configuração transformadas em web services REST.

ID Recurso URI Método

HTTP

Tipos e nomes de parâmetros da URI

1 CONFIG /{address}/configuration/runnning/ GET Path {address}

2 VLAN /{address}/vlan/all GET Path {address}

4 VLAN /{address}/vlan/{vlanid} PUT

Path {address}

{vlanid}

Query name

status 7 VLAN /{address}/vlan/{vlanid} DELETE Path {address}

{vlanid} 8 TBRE /{address}/routes/static GET Path {address} 11 IFACE /{address}/ports/{port}/ GET Path {address} {port}

12 IFACE /{address}/ports/{port}/ PUT

Path {address} {port} Query interfaceAddress subnetMask MTU description Fonte: Elaborado pelo autor.

Nota: Legenda para a coluna denominada recurso: CONFIG: Configurações do dispositivo de rede; VLAN: Virtual Lans – Rede Local Virtual (VLANs); TBRE: Tabela de Roteamento Estático;

IFACE: Interface de rede.

Legenda para a coluna denominada tipos e nomes de parâmetros da URI:

Path: Parâmetros inseridos diretamente na URI;

Query: Parâmetros adicionais passados explicitamente na URI e inseridos após o sinal de interrogação (?).

O quadro 13, além de demonstrar a estrutura (forma) de aceso aos web services REST, apresenta as condições norteadoras elencadas na seção 2.4.2 para os princípios desse estilo arquitetural. A definição de como as representações são acessadas e as operações básicas realizadas sobre elas é dada pela interface uniforme e apresentada pela coluna denominada método HTTP do quadro 13. Os parâmetros do tipo Path – identificados pela anotação @PathParam nos trechos de códigos dos web services (WS) REST – são inseridos diretamente na URI; já os parâmetros do tipo Query são atributos adicionais – identificados pela anotação @QueryParam – adicionados na query string da URI (contendo os dados do recurso que não são convenientes de serem adicionados a estrutura do seu caminho hierárquico). A separação através desses parâmetros foi necessária para não alongar a URI aos olhos do usuário, possibilitar o seu encadeamento, deixá-la clara, bem definida e tornar a aplicação endereçável. Cabe salientar que os métodos HTTP PUT e DELETE das tarefas 4, 7 e 12, apresentados pela interface uniforme, são tratados de forma idempotente seguindo

também as orientações de REST. Os web services REST foram desenvolvidos de forma a não manter o estado da aplicação; com isso nenhuma informação do lado do servidor é armazenada, fazendo com que todos os dados necessários para que a solicitação seja atendida sejam enviados através da URI ou por meio de parâmetros de cabeçalho.

O trecho de código apresentado no quadro 14 demonstra o mapeamento da tarefa 1 em um WS REST. Para esse WS é utilizado o método GET do HTTP (anotação @GET) com o objetivo de obter as configurações (representação de um recurso no formato JSON através da anotação @Produces("application/json")) em execução no roteador por meio da classe

RouterFunctions e do método getRunningConfigurationRouter disponibilizada pela API CLI

na camada de acesso e disposta no diagrama de classes da figura 9. Os atributos user e

password passados como parâmetro nesses métodos foram anonimizados, através de strings

de mesmo nome, nos códigos que detém essas características.

Quadro 14 – WS REST que retorna as configurações de um dispositivo de rede.

/**

* Método responsável por obter as configurações de um dispositivo de rede * @param address

* @return String - Contendo uma representação no formato JSON com o spool * oriundo do roteador mediante a execução do comando

*/ @GET

@Path("/{address}/configuration/runnning/")

@Produces("application/json")

public String RunningConfiguration(@PathParam("address") String address) {

//Crio um novo objeto do tipo Router passando como parâmetro seu endereço Router router = new Router(address, "user", "password");

//Executo o método da camada de acesso reponsável por obter //a configuração geral do roteador

return RouterFuntions.getRunningConfigurationRouter(router);

}

Fonte: Elaborado pelo autor.

A configuração de uma interface (porta) de rede de um dispositivo é apresentada no quadro 15. Nesse trecho de código é observada a utilização da interface uniforme por meio do método HTTP PUT, que trata da criação/atualização completa de um recurso (porta) oferecida pelo método de aplicação denominado configureInterface e apresentado no quadro 6.

Quadro 15 – WS REST que configura uma interface de rede.

/**

* Método responsável por configurar uma interface (recurso) de rede no * dispositivo de rede * @param address * @param port * @param interfaceAddress * @param subnetMask * @param MTU * @param description

* @return String - Contendo uma representação no formato JSON com o spool * oriundo do roteador mediante a execução do comando

*/ @PUT

@Path("/{address}/ports/{port}/")

@Produces("application/json")

@PathParam("port") String port,

@QueryParam("interfaceAddress") String interfaceAddress,

@QueryParam("subnetMask") String subnetMask,

@QueryParam("MTU") String MTU, @QueryParam("description") String description) {

//Crio um novo objeto do tipo Router passando como parâmetro seu endereço Router router = new Router(address, " user ", "password");

//Executo o método da camada de acesso reponsável por configurar a interface //passando os devidos parâmetros

return RouterFuntions.configureInterface(router, "0/" + port, interfaceAddress, subnetMask, MTU, description);

}

Fonte: Elaborado pelo autor.

O quadro 16 apresenta o método deleteRoute. Através desse método, implementado dentro de um WS REST de mesmo nome e por meio da interface uniforme DELETE, é realizada a exclusão de uma entrada na tabela de roteamento estático no dispositivo de rede.

Quadro 16 – WS REST que exclui uma entrada na tabela de roteamento estático.

/**

* Método responsável por excluir uma entrada da tabela de roteamento * @param address

* @param destination

* @param destinationPrefixMask

* @return String - Contendo uma representação no formato JSON com o spool * oriundo do roteador mediante a execução do comando

*/ @DELETE

@Path("{address}/routes/static/{destination}")

@Produces("application/json")

public String deleteRoute(@PathParam("address") String address,

@PathParam("destination") String destination,

@QueryParam("destinationPrefixMask") String destinationPrefixMask) {

//Crio um novo objeto do tipo Router passando como parâmetro seu endereço Router router = new Router(address, "user", " password");

//Executo o método da camada de acesso reponsável por //excluir uma entrada da tabela de roteamento

return RouterFuntions.deleteRoute(router, destination, destinationPrefixMask);

}

Fonte: Elaborado pelo autor.

Diferente dos WS REST, onde as tarefas foram mapeadas em recursos, os WS SOAP valem-se dessa divisão através de serviços, levando em consideração a transformação de uma funcionalidade de negócio relacionada às tarefas de gerência de configuração.

Os componentes da arquitetura SOA utilizados neste trabalho são o service provider (provedor de serviço) e o service consumer (consumidor de serviço). As especificações de

hardware desses componentes serão definidas na seção 3.4 que trata do cenário de testes. No

contexto desta dissertação a responsabilidade do provedor de serviço é de ser o componente que torna os serviços (tarefas) passíveis de serem executados. Já o consumidor de serviço (cliente) é o componente responsável por consultar a existência de serviços e invocá-las para a execução de uma determinada tarefa de gerência de configuração de redes. Cabe salientar que no cenário montado para este trabalho, o componente service registry (registro de serviço) foi suprimido, logo as interações entre provedores e consumidores são realizadas sem intermediações.

Através dessa arquitetura é abstraída a implementação interna do serviço por parte do provedor, pois o consumidor invoca somente as interfaces fornecendo os parâmetros, quando necessário, para a sua execução. As interações (requisições e respostas) entre os pares são realizadas por meio de web services e definidas pelo protocolo SOAP, que se fundamenta em um modelo de dados XML. Os serviços elencados no quadro 17 executam as tarefas apresentadas no quadro 1 da seção 3.2. As tarefas mapeadas em serviços e não listadas nesse quadro são encontradas no APÊNDICE D.

Quadro 17 – Tarefas de gerência de configuração transformadas em web services SOAP.

ID Métodos Parâmetros de entrada

1 getRunningConfigurationRouter address 2 getAllVLANs address 4 setNewVLAN address VLANid name state 7 deleteVLAN address VLANid 8 getStaticRoutes address 11 getPortConfigurationRouter address port 12 configureInterface address port interfaceAddress subnetMask MTU description 13 noShutdownInterface address port 14 shutdownInterface address port

Fonte: Elaborado pelo autor.

Percebe-se pelo exposto no quadro 17 que as operações em SOA são apresentadas por métodos get e set – quando sua correspondência for clara à execução da tarefa – diferente de ROA, onde as operações são tratadas como substantivos – representações de recursos acessados através das URIs – e os verbos ficam a cargo da interface uniforme. Outro fato que diferencia a utilização de WS baseados em SOAP dos WS que utilizam o estilo arquitetural REST trata basicamente do seu mapeamento individual e do não agrupamento dos serviços. Essa diferença é motivada pelas características oriundas da arquitetura SOA que abordam a granularidade fina e a reutilização. Através dessas duas características foi incorporada uma maior flexibilidade à aplicação fazendo com que cada serviço desempenhe uma funcionalidade clara e passível de ser reutilizada sem a dependência ou agregação de outros serviços (o chamado encadeamento) no caso de WS REST. Essas duas características também possibilitaram aos serviços a qualidade de

isolamento, onde permitiu-se a existência de apenas uma forma de acesso – através de um serviço fino e bem definido – para a execução de determinada tarefa evitando assim o uso de código redundante na aplicação.

O trecho de código apresentado no quadro 18 é semelhante ao demonstrado no quadro 14, onde é exibido um WS REST que retorna as configurações de um dispositivo de rede. Porém, este difere na interface de acesso que se dá através da anotação @WebMethod expondo essa funcionalidade aos consumidores por meio do protocolo SOAP. A passagem de parâmetros quando o acesso acontece por meio de SOAP, para essa aplicação, é definida pela anotação @WebParam. Cabe salientar que da mesma forma definida em REST os web

services SOAP acessam os métodos disponibilizados pela API CLI disposta na camada de

acesso.

Quadro 18 – WS SOAP que retorna as configurações de um dispositivo de rede.

/***

* WebMethod responsável por obter as configurações de um dispositivo de rede * @param address

* @return - String no formato XML com o spool oriundo do roteador mediante a execução * do comando

*/

@WebMethod(operationName = "getRunningConfigurationRouter")

public String getRunningConfigurationRouter(@WebParam(name = "address") String address) {

//Crio um novo objeto do tipo Router passando como parâmetro seu endereço Router router = new Router(address, "user", "password");

//Executo o método da camada de acesso reponsável por obter a configuração //geral do roteador

return RouterFuntions.getRunningConfigurationRouter(router);

}

Fonte: Elaborado pelo autor.

O trecho de código apresentado no quadro 19 se vale das mesmas características expostas pelo quadro 18, diferenciando-se na funcionalidade de negócio que é tratada pela tarefa de configuração de uma interface (porta) no dispositivo de rede.

Quadro 19 – WS SOAP que configura uma interface de rede.

/**

* Método responsável por configurar uma interface (recurso) de rede no * dispositivo de rede * @param address * @param port * @param interfaceAddress * @param subnetMask * @param MTU * @param description

* @return - String no formato XML com o spool oriundo do roteador mediante * a execução do comando

*/

@WebMethod(operationName = "configureInterface")

public String configureInterface(@WebParam(name = "address") String address, @WebParam(name = "port") String port,

@WebParam(name = "interfaceAddress") String interfaceAddress,

@WebParam(name = "subnetMask") String subnetMask,

@WebParam(name = "MTU") String MTU,

@WebParam(name = "description") String description) {

//Crio um novo objeto do tipo Router passando como parâmetro seu endereço Router router = new Router(address, "user", " password ");

//Executo o método da camada de acesso reponsável por obter a configuração //geral do roteador

return RouterFuntions.configureInterface(router, port, interfaceAddress, subnetMask, MTU, description); }

Fonte: Elaborado pelo autor.

O diagrama de sequência apresentado na figura 11 ilustra o processo de execução da tarefa 1 através de WS REST e SOAP. Com o intuito de facilitar a visualização do fluxo as condições de guarda durante a ocorrência de erros, por exemplo, nos procedimentos de conexão ao equipamento ou na execução de uma tarefa, foram omitidas do diagrama de sequência; entretanto, foram tratadas nas APIs e aplicações.

Figura 11 – Diagrama de sequência das aplicações REST e SOAP.