Como eu adiciono um relacionamento entre dois charms para passar informações entre eles?

5

Eu sou novo no juju. Até agora, criei e comecei a implantar um charme de aplicativo e separar o charme separadamente.

Mas agora, no aplicativo, preciso adicionar um relacionamento ao encanto do servidor e obter detalhes do encanto do servidor.

Detalhes como endereço público e endereço particular. Eu pesquisei sobre como adicionar relações entre dois encantos. Mas não estou claro sobre como adicionar relações e obter detalhes. Eu só sei que quero adicionar algum parâmetro no arquivo metadata.yaml.

Alguém pode me dizer como adicionar relação e obter detalhes do encanto do servidor? Basicamente eu preciso fornecer endereço IP pelo charme do servidor e depois de adicionar o relacionamento do charme do aplicativo precisa ler este endereço IP.

    
por Sajith Vijesekara 30.07.2014 / 11:45

1 resposta

6

Como defino um relacionamento?

Assim, para definir um relacionamento entre dois charms, você deve primeiro, como você fez a alusão, definir a relação em cada charms metadata.yaml file. Desde que você definiu uma função de servidor / cliente, vou manter isso em meus exemplos abaixo com foo-server e foo-client charms. Como é provável que o servidor forneça a maioria dos dados para o cliente , seus arquivos metadata.yaml ficariam assim:

foo-server

name: foo-server
description: Something more than this
provides:
  server:
    interface: foo

foo-client

name: foo-client
description: Something more than this
requires:
  backend:
    interface: foo

Juju tem dois tipos de relação principais. Fornece e requer. Neste caso, o encanto do servidor é fornecendo "foo" como uma interface. O charme do cliente requer que a interface "foo" funcione. Isso fornece / requer que o juju saiba quais charms podem falar com quais outros charms.

A interface é um nome arbitrário, neste caso foo, mas poderia ser qualquer coisa. Há uma lista grande de interfaces já definidas, como: mysql, http, mongodb, etc. Se o seu serviço fornecer uma dessas interfaces existentes gostaria de considerar a implementação. Se não estiver à vontade para criar um novo.

Como obtenho / envio dados?

Depois de definir seus metadados, você precisará criar alguns novos ganchos os nomes dos ganchos são definidos na documentação vinculada, mas como você está apenas enviando as informações de endereço, continuaremos com um exemplo simplificado da implementação de cada gancho.

Então, temos dois encantos, foo-server e foo-client . foo-server fornece uma relação "servidor" com a interface foo. foo-client requer uma relação "backend" com a interface foo. Ganchos de relação são nomeados com base no nome da relação (não no nome da interface). Estes dois podem ser chamados server, mas para ilustrar que juju corresponde na interface e não na relação, eu fiz o nome da relação foo-client "backend".

foo-server / hooks / server-relation-joined

#!/bin/bash

set -eux

relation-set hostname='unit-get private-address'

Este é um exemplo muito básico, em que estamos criando uma chave de relação chamada hostname e definindo o valor, usando o comando unit-get , para o endereço privado da unidade em que o encanto está implantado. Este endereço irá variar de provedor para provedor, mas será sempre acessível dentro de um ambiente de juju. Você pode definir várias chaves adicionando um espaço entre as teclas, por exemplo:

relation-set hostname='unit-get private-address' public-address='unit-get public-address'

Isso enviará duas chaves, hostname e public-address para qualquer serviço ao qual esteja conectado.

foo-client / hooks / relação de backend alterada

Observe a diferença no nome do arquivo, que está chamando o relation-changed hook em vez de relation-joined . Presumivelmente, o servidor está apenas dando os detalhes de onde ele mora, portanto, o encanto do cliente precisa saber onde esse endereço está. Colocando isso no gancho relation-changed toda vez que os dados na relação são atualizados, o hook é chamado novamente.

#!/bin/bash

set -eux

server_address='relation-get hostname'

if [ -z "$server_address" ]; then
  juju-log "No data sent yet"
  exit 0
fi

# If you've gotten this far, you have a $server_address, configure as you see fit

Agora, há um pouco mais de envolvimento nesse gancho. Tomando linha a linha, os três primeiros são apenas coisas padrão. É um charme bash e set -eux está lá para garantir que o gancho se comporte como deveria. A próxima linha usa relation-get , que lerá dados de relação da conexão. Agora, tudo em um ambiente de juju é orquestrado de forma assíncrona. Então você nunca tem 100% de certeza de que terá dados quando ligar para relation-get . É aqui que o bloco if ajuda a resolver isso. Se não houver nada em "$ server_address", ou seja, não obtivermos um valor de retorno, o gancho sairá da forma simples. No entanto, ele está saindo com um status zero, então não aparecerá como um erro no juju.

Eu sei que isso parece contra-intuitivo, tecnicamente temos um problema porque não temos dados. Sim, mas é mais na linha de "Ainda não temos dados". Ao sair de zero, assim que o serviço correspondente realmente definir o valor, ele acionará o gancho relation-changed novamente e poderemos ler o valor. Este é considerado um exemplo de um guarda de idempotência que é crucial à medida que você escreve ganchos .

    
por Marco Ceppi 30.07.2014 / 17:05

Tags