[SCSM] Système de gestion de main courante, le making-of partie 3 : Création d’un workspace et de vues avec Visual Studio Authoring Extensions

Cet article est le troisième et dernier de la série sur la création d’un système de gestion de main courante.

Maintenant que nous avons notre classe et notre formulaire, il s’agit de faire tenir le tout dans la console SCSM.

Pour la beauté du geste et parce que de toute façon ce n’est ni un « work item » ni un « configuration item » nous allons créer un espace de travail dédié avec les dossiers et vues par défaut qui permettront de démarrer la gestion des mains courantes.

Nous allons ensuite créer des dossiers, des vues et commencer à peupler la liste d’énumération qui contient le type d’intervention.

Nous allons effectuer ces opérations dans Visual Studio avec VSAE.

Etapes

Résultat

Lancez Visual Studio et créez un nouveau projet de type Service Manager 2012 R2 Management Pack

Commencez par récupérer les futures dépendances dont vous aurez besoin.

Sur la machine avec l’authoring tool, rendez-vous dans le dossier « library » de l’authoring tool et copiez dans votre projet Visual Studio les fichiers suivants :

Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.mp

Microsoft.EnterpriseManagement.ServiceManager.UI.Console.mp

System.WorkItem.Library.mp

Ajoutez les mp en tant que référence.

Pensez à donner un alias à votre référence.

Faites la même chose avec le mp qui contient votre classe et votre formulaire.

Créez les images au format png qui agrémenteront votre espace de travail.

Personnellement j’utilise le produit Metro Studio 4 pour créer mes png.

Vous aurez besoin d’une même image aux formats :

  • 16*16px
  • 24*24px
  • 64*64px

Ajoutez ensuite vos images en tant qu’éléments existants.

Modifiez la « build action » des images pour les mettre en « embedded resource ».

Nous allons commencer par créer notre espace de travail.

Ajoutez un nouvel élément à votre projet et choisissez « Folder & Folder Item » car en réalité un workspace dans la console SCSM est un dossier.

Commençons par la base.

Créez les dossiers nécessaires dans les balises <folders> :

<Folder
ID=« Folder.SCSMDayBook« 
Accessibility=« Public« 
ParentFolder=« Console!ServiceManager.Console.RootFolder« />

<Folder
ID=« Folder.SCSMDayBook.RootFolder« 
Accessibility=« Public« 
ParentFolder=« Folder.SCSMDayBook« />

Chaque objet qui doit être affiché dans la console doit avoir ses display strings localisées par langues :

<DisplayString
ElementID=« Folder.SCSMDayBook« >

<Name>Daybook</Name>

<Description></Description>

</DisplayString>

<DisplayString
ElementID=« Folder.SCSMDayBook.RootFolder« >

<Name>Daybook</Name>

<Description></Description>

</DisplayString>

Nous allons ensuite ajouter les images.

On commence par déclarer nos fichiers png, créez un nœud « Resources » après « language packs »:

<Resources>

<Image
ID=« Image.Library.16.png« 
Accessibility=« Public« 
FileName=« Library.16.png« />

<Image
ID=« Image.Library.24.png« 
Accessibility=« Public« 
FileName=« Library.24.png« />

<Image
ID=« Image.Library.64.png« 
Accessibility=« Public« 
FileName=« Library.64.png« />

</Resources>

Nous allons ensuite indiquer à SCSM comment traiter les images, on va pour cela créer un nœud « Categories » en début de fichier. Cela permettra notamment à SCSM de savoir quelle taille d’image utiliser quand le workspace est ouvert ou fermé.

<Categories>

<Category
ID=« Category.Image.Library.16.png« 
Value=« System!System.Internal.ManagementPack.Images.u16x16Icon« 
Target=« Image.Library.16.png«  />

<Category
ID=« Category.Image.Library.24.png« 
Value=« System!System.Internal.ManagementPack.Images.u32x32Icon« 
Target=« Image.Library.24.png«  />

<Category
ID=« Category.Image.Library.64.png« 
Value=« System!System.Internal.ManagementPack.Images.u32x32Icon« 
Target=« Image.Library.64.png«  />

</Categories>

SCSM ne propose que deux formats de gestion : 16 et 32 pixels. Ce n’est pas grave nos images 24 et 64 pixels seront correctement affichées malgré tout.

Nous allons ensuite assigner nos images à nos dossiers en créent un nœud « imagesreferences » après « folders ».

<ImageReferences>

<ImageReference
ImageID=« Image.Library.16.png« 
ElementID=« Folder.SCSMDayBook« />

<ImageReference
ImageID=« Image.Library.24.png« 
ElementID=« Folder.SCSMDayBook« />

<ImageReference
ImageID=« Image.Library.16.png« 
ElementID=« Folder.SCSMDayBook.RootFolder« />

<ImageReference
ImageID=« Image.Library.64.png« 
ElementID=« Folder.SCSMDayBook.RootFolder« />

</ImageReferences>

Vous pouvez déjà faire un test en générant votre projet et en l’important (pensez à relancer la console après l’import):

Nous allons maintenant ajouter un peu de contenu. Nous allons créer un dossier « Logical access » et « Physical access »

Nous allons être modulaires et nous allons ajouter un élément au lieu de continuer à charger notre mpx actuel.

Ajoutez un nouvel élément de type folder :

Comme tout à l’heure créez d’abord les dossiers :

<Folders>

<Folder
ID=« Folder.SCSMDayBook.PhysicalAccess« 
Accessibility=« Public« 
ParentFolder=« Folder.SCSMDayBook.RootFolder«  />

<Folder
ID=« Folder.SCSMDayBook.LogicalAccess« 
Accessibility=« Public« 
ParentFolder=« Folder.SCSMDayBook.RootFolder«  />

</Folders>

Notez bien le parent folder qui pointe sur le root que nous avons créé précédemment.

Nous allons ajouter la possibilité de créer des vues et dossier depuis ces dossiers. Cela se fait en ajoutant des taches via les folderitems :

<FolderItem
ElementID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Task.CreateFolder« 
ID=« folder.SCSMDayBook.folderitem.createfolder« 
Folder=« Folder.SCSMDayBook.RootFolder«  />

<FolderItem
ElementID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Task.CreateFolder« 
ID=« folder.SCSMDayBook.folderitem.createfolder« 
Folder=« Folder.SCSMDayBook.PhysicalAccess«  />

<FolderItem
ElementID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Task.CreateGridView« 
ID=« folder.SCSMDayBook.folderitem.createview« 
Folder=« Folder.SCSMDayBook.PhysicalAccess«  />

<FolderItem
ElementID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Task.CreateFolder« 
ID=« folder.SCSMDayBook.folderitem.createfolder« 
Folder=« Folder.SCSMDayBook.LogicalAccess«  />

<FolderItem
ElementID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Task.CreateGridView« 
ID=« folder.SCSMDayBook.folderitem.createview« 
Folder=« Folder.SCSMDayBook.LogicalAccess«  />

Nous allons donner à nos dossiers l’icône par défaut. Ajoutez un nœud « imagesreferences » après les « folderitems » :

<ImageReferences>

<ImageReference
ElementID=« Folder.SCSMDayBook.PhysicalAccess« 
ImageID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Image.Folder« />

<ImageReference
ElementID=« Folder.SCSMDayBook.LogicalAccess« 
ImageID=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Image.Folder« />

</ImageReferences>

L’important ici est l’id de l’image : « Console » correspond à mon alias pour le management pack Microsoft.EnterpriseManagement.ServiceManager.UI.Console, Microsoft.EnterpriseManagement.ServiceManager.UI.Console.Image.Folder est le nom de l’icône des dossiers.

Et enfin on n’oublie pas les display strings :

<DisplayStrings>

<DisplayString
ElementID=« Folder.SCSMDayBook.PhysicalAccess« >

<Name>Physical Access</Name>

<Description></Description>

</DisplayString>

<DisplayString
ElementID=« Folder.SCSMDayBook.LogicalAccess« >

<Name>Logical Access</Name>

<Description></Description>

</DisplayString>

</DisplayStrings>

On peut régénérer notre projet pour voir l’avancement (les « quick win » c’est important) :


Notez la possibilité de créer des vues et dossiers.

Nous allons maintenant pré remplir la liste de types d’intervention avec l’arborescence suivante :

  • Logical Access
    • Active directory administrative privileges
  • Physical Access
    • Access to server room

Ajoutez un nouvel élément de type « empty management pack fragment »


Le remplissage d’une liste est assez simple voici le code complet de cette partie :

<ManagementPackFragment
SchemaVersion=« SM2.0« 
xmlns:xsd=« http://www.w3.org/2001/XMLSchema« >

<TypeDefinitions>

<EntityTypes>

<EnumerationTypes>

<EnumerationValue
Ordinal=« 0« 
Parent=« SDC!EnumId_Type« 
Accessibility=« Public« 
ID=« Enum.logical« />

<EnumerationValue
Ordinal=« 1« 
Parent=« SDC!EnumId_Type« 
Accessibility=« Public« 
ID=« Enum.physical« />

<EnumerationValue
Ordinal=« 2« 
Parent=« Enum.logical« 
Accessibility=« Public« 
ID=« Enum.adadmin« />

<EnumerationValue
Ordinal=« 3« 
Parent=« Enum.physical« 
Accessibility=« Public« 
ID=« Enum.serverroom« />

</EnumerationTypes>

</EntityTypes>

</TypeDefinitions>

<LanguagePacks>

<LanguagePack
ID=« ENU« 
IsDefault=« true« >

<DisplayStrings>

<DisplayString
ElementID=« Enum.logical« >

<Name>Logical Access</Name>

<Description></Description>

</DisplayString>

<DisplayString
ElementID=« Enum.physical« >

<Name>Physical Access</Name>

<Description></Description>

</DisplayString>

<DisplayString
ElementID=« Enum.adadmin« >

<Name>Active directory administrative privileges</Name>

<Description></Description>

</DisplayString>

<DisplayString
ElementID=« Enum.serverroom« >

<Name>Access to server room</Name>

<Description></Description>

</DisplayString>

</DisplayStrings>

</LanguagePack>

</LanguagePacks>

</ManagementPackFragment>

On pourrait s’arrêter là, mais nous allons créer deux vues par défaut en utilisant les snippets au lieu du template de vue inclus par défaut dans les VSAE mais que je n’ai jamais réussi à faire marcher.

Les snippets vont nous permette de définir un modèle de XML dans lequel nous modifierons juste quelques éléments.

Ajoutez au projet un nouvel élément de type « Snippet Template »

Effacez toute la partie « monitoring », créez à la place une arborescence :

  • Presentation
    • Views
    • FolderItems
    • StringResources

Creez le squelette qui définit une vue :

<Views>

<View
ID=« 
#text(‘View ID’)#« 
Accessibility=« Public« 
Enabled=« true« 
Target=« SDC!Daybook« 
TypeID=« Console!GridViewType« 
Visible=« true« >

<Category>NotUsed</Category>

<Data>

</Data>

<Presentation>

</Presentation>

</View>

</Views>

Notez le #text(‘View ID’)# qui nous permettra lors de la création d’une vue de remplir simplement cette variable dynamique.

L’attribut Target représente le type d’objet qui sera affichez dans la vue, adaptez l’alias à ce que vous avez choisi.

Le type « GridView » est le type de vue par défaut dans SCSM.

Nous allons ajouter les adaptateurs, il s’agit d’objets par défaut qui permettent à SCSM d’afficher et manipuler les objets affichés dans les vues :

<Adapters>

<Adapter
AdapterName=« dataportal:EnterpriseManagementObjectAdapter« >

<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>

<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter</AdapterType>

</Adapter>

<Adapter
AdapterName=« viewframework://Adapters/AdvancedList« >

<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>

<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>

</Adapter>

<Adapter
AdapterName=« omsdk://Adapters/Criteria« >

<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>

<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>

</Adapter>

</Adapters>

Maintenant que SCSM sait gérer les objets on va lui indiquer ou les trouver nous allons donc ajouter la section suivante à la suite des adapters :

<ItemsSource>

<AdvancedListSupportClass
DataTypeName=«  »
AdapterName=« viewframework://Adapters/AdvancedList« 
FullUpdateAdapter=« dataportal:EnterpriseManagementObjectAdapter« 
DataSource=« mom:ManagementGroup« 
FullUpdateFrequency=« 1« 
Streaming=« true« 
IsRecurring=« true« 
RecurrenceFrequency=« {x:Static s:Int32.MaxValue}« 
xmlns=« clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework« 
xmlns:av=« http://schemas.microsoft.com/winfx/2006/xaml/presentation« 
xmlns:x=« http://schemas.microsoft.com/winfx/2006/xaml« 
xmlns:s=« clr-namespace:System;assembly=mscorlib« >

<AdvancedListSupportClass.Parameters>

<QueryParameter
Parameter=« ManagementPackClassId« 
Value=« $MPElement[Name=’SDC!Daybook’]$«  />

</AdvancedListSupportClass.Parameters>

</AdvancedListSupportClass>

</ItemsSource>

Pour clore le nœud « data » nous y ajoutons un nœud « criteria » que nous laisserons vide pour le moment. Ce nœud contient les critère pour filtrer quels éléments seront dans la vue.

Nous allons maintenant ajouter une colonne contenant les titres de nos objets.

Commencez par ajouter les éléments suivants dans « presentation »

<Columns>

<mux:ColumnCollection
xmlns=« http://schemas.microsoft.com/winfx/2006/xaml/presentation« 
xmlns:mux=« http://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView« 
xmlns:s=« clr-namespace:System;assembly=mscorlib« 
xmlns:x=« http://schemas.microsoft.com/winfx/2006/xaml« 
xmlns:datebinding=« clr-namespace:Microsoft.EnterpriseManagement.UI.Extensions;assembly=Microsoft.EnterpriseManagement.UI.Extensions« 
xmlns:data=« clr-namespace:Microsoft.EnterpriseManagement.UI.Extensions;assembly=Microsoft.EnterpriseManagement.UI.Extensions« 
xmlns:appCommon=« clr-namespace:Microsoft.EnterpriseManagement.ServiceManager.Application.Common;assembly=Microsoft.EnterpriseManagement.ServiceManager.Application.Common« 
xmlns:toolbox=« clr-namespace:Microsoft.EnterpriseManagement.UI.WpfToolbox;assembly=Microsoft.EnterpriseManagement.UI.FormsInfra« 
xmlns:slaBinding=« clr-namespace:Microsoft.EnterpriseManagement.ServiceManager.SLA.Common;assembly=Microsoft.EnterpriseManagement.ServiceManager.SLA.Common« >

<mux:Column
Name=« Title« 
DisplayMemberBinding=« {Binding Path=Title, Mode=OneWay}« 
Width=« 100« 
DisplayName=« Title.
#text(‘View ID’)#« 
Property=« Str_Desc« 
DataType=« s:String«  />

</mux:ColumnCollection>

</Columns>

<AdditonalProperties />

<ViewStrings>

<ViewString
ID=« Title.
#text(‘View ID’)#« >$MPElement[Name= »Title.#text(‘View ID’)#« ]$</ViewString>

</ViewStrings>

Notez que le binding de la colonne se fait sur l’attribut « title » de la classe.

Ajouter une colonne ne se fait pas si simplement nous ajoutons donc dans la colonne le display name d’une ressource de type string que nous déclarons dans « ViewStrings ». Nous suffixons l’ID de la Viewstring par l’ID de la vue pour s’assurer de son unicité, de plus le fait d’utiliser l’id de la vue nous fait une varible de moins à renseigner.

Nous allons ensuite assigner notre vue à un dossier. Cela se fait par l’intermediaire d’un folderItem :

<FolderItems>

<FolderItem
ID=« folderItem.
#text(‘View ID’)#« 
ElementID=« 
#text(‘View ID’)#« 
Folder=« 
#choice(‘Container’, list(Folder.SCSMDayBook.PhysicalAccess,Folder.SCSMDayBook.LogicalAccess))#«  />

</FolderItems>

Comme précédemment pour créer l’ID du folderitem nous allons encore utiliser l’ID de la vue c’est toujours ça de gagné.

En ce qui concerne le choix du dossier nous utiliserons une liste de choix déroulant nous permettant de choisir soit le dossier des accès physiques ou celui des accès logiques.

Nous allons ensuite les taches de modification, suppression de la vue et la tache de création d’objet. Creez le noed categories tel quel :

<Categories>

<Category
Value=« Console!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ViewTasks« 
Target=« 
#text(‘View ID’)#« 
ID=« Category.
#text(‘View ID’)#.viewtasks« />

<Category
Value=« EnterpriseManagement!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.CreateTypeCategory« 
Target=« 
#text(‘View ID’)#« 
ID=« Category.
#text(‘View ID’)#.createobjecttask« />

</Categories>



Nous devons ensuite déclarer la stringresource liée à notre colonne :

<StringResources>

<StringResource
ID=« Title.
#text(‘View ID’)#« />

</StringResources>

Il s’agit ici de refaire référence à l’ID de notre viewstring.

Et pour finir, les displaystrings :

<DisplayStrings>

<DisplayString
ElementID=« 
#text(‘View ID’)#« >

<Name>#text(‘View Display Name’)#</Name>

</DisplayString>

<DisplayString
ElementID=« Title.
#text(‘View ID’)#« >

<Name>Title</Name>

<Description/>

</DisplayString>

</DisplayStrings>

Nous y voilà. Enregistrez le template et ajoutez un nouvel élément de type snippet data :

Et la tout va devenir clair. Choisisser le type de snippet :


Et prenez notre template :


Et alors vous n’avez plus qu’à créer des vues selon votre bon vouloir :

Il ne reste plus qu’à générer le projet et à importer le mpb. Il ne restera qu’à modifier à la main les critères des vues « server room » et « ad admin » pour filtrer selon les valeurs de la liste.



Publicités

Une réflexion sur “[SCSM] Système de gestion de main courante, le making-of partie 3 : Création d’un workspace et de vues avec Visual Studio Authoring Extensions

  1. Pingback: MicrosoftTouch

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s