Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migrated to Confluence 5.3
Propriétés de la page
labelsoa-service
Date de lancementSeptembre 2016
État du Service
État
subtletrue
colourGreen
titleProduction
ConcepteursAlexandre Narbonne
Sourceshttps://github.com/gadzorg/GoogleDirectoryDaemon
Clés de routage écoutées
request.googleapps.user.create
request.googleapps.user.update
request.googleapps.user.delete
notify.account.updated
Clés de routage émises
notify.googleapps.user.created
notify.googleapps.user.updated
notify.googleapps.user.deleted

Présentation du service

Ce service pilote les comptes GoogleApps. Il permet à n'importe quel application de piloter les compte google.

Cette fonction était auparavant supportée par Platal avec l'application python GappsD développée par les X

L'utilisation d'un micro service permet de découpler l'appli donneuse d'ordre de l'implémentation et d'implémenter une vrai queue d'actions

C'est une application autonome stateless

Sommaire
outlinetrue

Infos pour les Ops

Environnements

Développement

Domaine Google Apps de recette Poubs.org

VHost rabbit MQ pour chaque developpeurs

L'instance de l'API GrAMv2 est à héberger par le developpeur

Recette

HébergementHeroku
CaractéristiquesApp rec-gapps-daemon sur appartenant à l'utilisateur [email protected]
Resources
  • Domaine Google Apps de recette Poubs.org
  • GrAM de production : utilisateur rec-google-directory-daemon
  • Utilisateur RabbitMQ : rec-google-directory-daemon

Production

HébergementHeroku
CaractéristiquesApp gapps-daemon sur appartenant à l'utilisateur [email protected]
Resources
  • Domaine Google Apps Gadz.org
  • GrAM de production : utilisateur prod-google-directory-daemon
  • Utilisateur RabbitMQ : prod-google-directory-daemon

Dépendances extérieures

API Google

Redis pour être stateless (stockage des token de l'api Google)

Api Gram

Déploiement

Configuration

L'application fonctionne soit avec des variables d'environnement, soit avec un fichier de configuration.

Le fichier de configuration est situé dans config/config.yml

Bloc de code
themeEclipse
titleExemple de fichier config/config.yml
default: &default
  application_name: GoogleDirectoryDaemon-test
  application_id: gdd

  authorizer: DefaultAuthorizer

  admin_user_id: my.user@my_org.com
  message_handler_map:
    request.gapps.create: DefaultMessageHandler

  rabbitmq_host: localhost
  rabbitmq_port: 5672
  rabbitmq_vhost: /
  rabbitmq_queue_name: gdirdaemon
  rabbitmq_deferred_time: 1800000
  rabbitmq_max_attempts: 48
  exchange_name: exchange
  rabbitmq_user: my_user
  rabbitmq_password: P4ssWord

  log_routing_key:"logging.key"
  gram_api_host: myHost.com
  gram_api_user: myUser
  gram_api_password: PasswRD
  gram_api_proxy: myproxy.mydomain.com
 
  logger_level: DEBUG


development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

 

Tout ces attributs peuvent être indiquer en variable d'environnement en les mettant en majuscules et en prefixant le nom avec GDD_

Les variables d'environnement sont prioritaires sur le fichier de configuration

Exemple : GDD_RABBITMQ_HOST

L'environnement utilisé est défini par la variable d'environnement GOOGLE_DIRECTORY_DAEMON_ENV et à pour valeur "development" par défaut

La variable logger_level permet de définir la verbosité des logs. Les valeurs autorisées sont :

  • DEBUG - valeur par défaut
  • INFO
  • WARN
  • ERROR
  • FATAL

Pour fonctionner les API google on besoin d'un json appelé client_secret.json.

Ce fichier est stocké dans le dossier secrets/

Il est également possible de stocker le JSON dans la variable d'environnement GDD_GOOGLE_CLIENT_SECRET

Si la variable d'environnement REDIS_URL est définie l'appli stockera les token de connexion dans le Redis, sinon ils  seront stocké dans secrets/tokens.yaml

Arret / Démarage

Sur Heroku :

Suivre la procédure Démarrer/Arrêter une application sur Heroku

En local :

Lancer l'executable bin/worker pour démarrer le service

Ctrl+C pour le couper ou envoyer SIGINT (kill -2)

 

Accéder aux Logs

 

Suivre la procédure Accéder aux logs d'une application Heroku


Installation

Infos pour les Dev'

Notifications générées

Clé de routageQuand ?Contenu du messageExemple de contenu
notify.googleapps.user.createdQuand la création d'un compte et de ses alias ne retourne aucune erreur

uuid : l'uuid du compte

google_id : id du compte google créé

Bloc de code
themeEclipse
languagejavascript
{
	"uuid": "4fa874db-7730-4105-b550-8ea991907240",
    "google_id": "123465789123034"
}
notify.googleapps.user.updated 

uuid : l'uuid du compte

google_id : id du compte google créé

Bloc de code
themeEclipse
languagejavascript
{
	"uuid": "4fa874db-7730-4105-b550-8ea991907240",
    "google_id": "123465789123034"
}
notify.googleapps.user.deletedQuand un compte est supprimé avec succés

key : id du compte google supprimé

Bloc de code
themeEclipse
languagejavascript
{
	"key": "4fa874db-7730-4105-b550-8ea991907240"
}
Astuce

N'oubliez pas de mettre à jour la propriétés "Clés de routage émises" de la page avec les nouvelles routing keys

Avertissement
titleChangement des spécifications

Si vous modifiez le format d'une notification existante, essayez au maximum de conserver les données précédentes et pensez à reporter les changements sur les services clients de cette notification

 

Requêtes faites à d'autres services

Clé de routageCommentaires
Astuce

N'oubliez pas de mettre à jour la propriétés "Clés de routage émise" de la page avec les nouvelles routing keys

Requetes écoutées

Clé de routageActions effectuéesContenu du messageExemple de contenu
request.googleapps.user.create

Crée un compte google apps et ses alias.

Récupère le mots de passe depuis le GrAM

Met à jour l'id google dans le GrAM si le compte est créé avec succès.

Bloc de code
titleSCHEMA JSON
{  
   "$schema":"http://json-schema.org/draft-04/schema#",
   "title":"Create Google Account message schema",
   "type":"object",
   "properties":{  
      "gram_account_uuid":{  
         "type":"string",
         "description":"The unique identifier of linked GrAM Account",
         "pattern":"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
      },
      "primary_email":{  
         "type":"string",
         "description":"Primary email address used to create google account"
      },
      "aliases":{  
         "type":"array",
         "description":"Google account email aliases",
         "items":{  
            "type":"string"
         }
      }
   },
   "additionalProperties":true,
   "required":[  
      "gram_account_uuid",
      "primary_email"
   ]
}
Bloc de code
themeEclipse
languagejavascript
{
  "gram_account_uuid":"36a7e016-a300-4f52-85f4-6804dede6c6b",
  "primary_email":"[email protected]",
  "aliases":[]
}
request.googleapps.user.update

Met à jour le compte

Récupère le mots de passe depuis le GrAM

Bloc de code
titleSCHEMA JSON
{  
   "$schema":"http://json-schema.org/draft-04/schema#",
   "title":"Update Google Account message schema",
   "type":"object",
   "properties":{  
      "gram_account_uuid":{  
         "type":"string",
         "description":"The unique identifier of linked GrAM Account",
         "pattern":"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
      },
      "primary_email":{  
         "type":"string",
         "description":"Primary email address uof google account"
      },
      "aliases":{  
         "type":"array",
         "description":"Google account email aliases",
         "items":{  
            "type":"string"
         }
      }
   },
   "additionalProperties":true,
   "required":[  
      "gram_account_uuid"
   ]
}
Bloc de code
themeEclipse
languagejavascript
{
  "gram_account_uuid":"36a7e016-a300-4f52-85f4-6804dede6c6b",
  "aliases":[]
}
request.googleapps.user.deleteSupprime le compteLa clé google_account_key est necessaire
Bloc de code
themeEclipse
languagejavascript
{
  "google_account_key":"123465789123034"
}
Astuce

N'oubliez pas de mettre à jour la propriétés "Clés de routage écoutées" de la page avec les nouvelles routing keys

Avertissement
titleChangement des spécifications

Si vous modifiez le format d'une requete existante, pensez à reporter les changements sur les services clients de cette requete

Notifications écoutées

Clé de routageActions effectuées
notify.account.updatedConvertit key en gram_account_uuid et transmet à request.googleapps.user.update
Astuce

N'oubliez pas de mettre à jour la propriétés "Clés de routage écoutées" de la page avec les nouvelles routing keys

Codes erreurs

Erreur lors de la validation des données

Le message est compris mais ne correspond pas au schéma attendu.

Réponse
Status: Hardfail
Code erreur : 422 - Unprocessable Entity
Nom de l'erreur : InvalidPayload
Données :

  • DOIT contenir les erreurs par rapport au schema
  • PEUT contenir le schéma attendu

Identifiant google déjà enregistré dans le GrAM

Le compte GrAM contient déjà un identifiant Google et cet identifiant renvoie sur un compte existant.
Dans le cas d'utilisation par GorgMai, un membre du support doit intervenir pour vérifier que ce compte est bien celui de l'utilisateur. Si c'est le cas il modiie les alias afin de correspondre aux données de GorgMail. Si ce n'est pas le cas il doit supprimer l'identifiant dans le GrAM afin de relancer la procedure et créer un nouveau compte.

Réponse
Status: Hardfail
Code erreur : 409 - Conflict
Nom de l'erreur : GoogleAccountAlreadyRegisteredInGram
Données :

  • DOIT contenir les infos du compte google enregistré dans GrAM :
    • L'identifiant Google (numérique)
    • L'adresse principale
    • Le prenom
    • Le nom
    • Le UUID de l'utilisateur si celui ci est energistré chez Google

Notes
Si un compte GrAM contient déjà un identifiant Google mais que cet identifiant ne correspond pas à un compte Google existant, il est ignoré et écrasé par le compte Google nouvellement créé.

Adresse principale déjà enregistrée chez Google

Le compte google ne peut pas être créé car un compte google existe déjà avec cette adresse. Il peut s'agir d'une adresse principale ou d'un alias. Cette erreur est grave car elle signifie qu'une adresse Gadz.org a été réattribué et une intervention humaine est nécessaire pour rétablir l'unicité des adresses Gadz.org

Réponse
Status: Hardfail
Code erreur : 409 - Conflict
Nom de l'erreur : GoogleAccountAlreadyExists
Données :

  • DOIT contenir les infos du compte google en doublon
    • L'identifiant Google (numérique)
    • L'adresse principale
    • Le prenom
    • Le UUID de l'utilisateur si celui ci est energistré chez Google
    • Le nom

Erreur lors de l'execution.

Une erreur est apparu pendant l'execution du code. Il peut s'agir d'une erreur prévu ou non.

Réponse
Status: Hardfail
Code erreur : 500 - InternalError
Nom de l'erreur : Par défaut "InternalError"
Données :

  • DOIT contenir l'état du compte Google et ses données d'identifications
  • DOIT contenir le nom de l'erreur interne ayant été levé
  • PEUT contenir des données de debug

Cas particulier : Erreur lors de la mise à jour du compte GrAM

Il s'agit d'une erreur facilement identifiable. Généralement, elle apparaît lorsqu'un compte gram a été enregistré de force avec des données invalides et refuse ainsi toute mise à jour tant que les données invalides ne sont pas corrigées. Si ce bug apparaît, le compte google a bien été créé mais il n'est pas lié avec le compte GrAM. Une correction manuelle est nécessaire et l'enregistrement du compte google dans le GrAM doit être réalisé manuellement.

Données supplémentaires à inclure dans le debug :

  • Les données du compte GrAM à enregistrer (en prenant soin de supprimer le hash du mot de passe)