概要
今回は申請を受けたらDNS登録を行う申請フォームを作成します。今回はServiceNowのフォームとフローを作成します。
更新セットの作成
前回の「実践ServiceNow:開始日と終了日フィールドがあるフォームの作成」(https://qiita.com/htshozawa/items/e039220114a8a9ae2949)ではアプリケーションの一部を作成しましたが、今回は実際に利用できるアプリケーションを作成するためにテスト及び本番環境に移動することも考えます。ServiceNowで他インスタンスにアプリケーションを移動する仕組みとして 更新セット が用意されています。開発したServiceNowインスタンんすから更新セットをエクスポートして生成されたxmlファイルを別のServiceNowインスタンスにインポートする仕組みです。更新セットが有効な場合はエクスポートされるxmlファイルに含まれます。
それでは先ず更新セットを有効にします。
1.アプリケーションナビゲータに「更新セット」と入力して「ローカル更新セット」を選択します。新しい更新セットを作成するために「新規」ボタンを押下します。
2.次に更新セットを識別するたに「Name」と「説明」を入力します。項目Nameは人が更新セットを識別するための名前です。ServiceNow内部ではすべての要素をsys_idと言う32ビットのGUIDで要素を識別しています。名前を同じにしてもServiceNow内部で振り与えるsys_idが異なります。更新セットをインポートする場合に関連した要素が更新セットに含まれていないとエラーになりますが、同じ名前の要素を作成してもsys_idが異なるので問題は解決されません。そのような場合はインポート先に関連した要素を新しく作成した後にその要素のsys_idを見つけて更新セットのxmlを手動で修正します。
3.項目「Name」と項目「説明」を入力した後に「送信して最新にする」ボタンを押下します。「送信して最新にする」ボタンを押下すると新しい更新セットを作成してその更新セットが有効になります。ここから作成されたアプリケーション要素は更新セットに含まれます。ただ「更新」ボタンを押下すると更新セットは作成されますが、有効にされないので後から有効にする必要があります。更新セットの詳細については別記事で説明します。
4.更新セット一覧に作成した内容の更新セットが表示されます。ステータスが「処理中」であることを確認します。
正規表現の作成(質問の正規表現の作成)
フォームフィールドの入力チェックはフォーム毎にUIポリシーやクライアントスクリプトで行うことは出来ますが、IPアドレスやドメイン名など共有したフィールドのチェックは正規表現で行えます。正規表現を修正するとその正規表現を利用しているすべてのフォームのチェックも更新されます。
次の手順で正規表現を作成します。
1.アプリケーションナビゲータから「正規」を検索します。「サービスカタログ」下の「変数の妥当性確認の正規表現」を選択します。
正規表現を新規に作成するので「新規」ボタンを押下します。
2.正規表現の名前を正規表現を入力します。
項目名 | 値 | コメント |
---|---|---|
名前 | Internal Domain Name | |
正規表現 | ^((?:(?:(?:\w[\.\-\+]?)*)\w)+)((?:(?:(?:\w[\.\-\+]?){0,62})\w)+)\.works-hi.((com|co.jp))$ | 自社の正規表現と置き換える |
3.入力した後に「送信」ボタンを押下して「質問の正規表現一覧」ページに戻ります。
4.同じようにIPv4アドレス用の正規表現も作成します。
項目名 | 値 | コメント |
---|---|---|
名前 | IPv4 | |
正規表現 | ^(?:(?:250-5{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ |
申請フォームの作成
DNS申請フォームを作成します。
始めてServiceNowフォームを作成される場合は「実践ServiceNow:開始日と終了日フィールドがあるフォームの作成」(https://qiita.com/htshozawa/items/e039220114a8a9ae2949)も参照してください。
1.アプリケーションナビゲータから「アイテムの」を検索して、「アイテムの管理」を選択します。
2.「新規」ボタンを押下します。
3.名前を「DNS Update Request」にして、簡単な説明を「Update Internal DNS Record」と入力します。
4.フォームにフィールドを定義するので、フォーム作成ページに残るためにヘッダ部分を右クリックして「保存」を選択します。もし、「送信」ボタンを押下した場合は「カタログアイテム」一覧ページに戻るので、一覧から「DNS Update Request」を選択してフォーム設定ページを表示します。
項目「責任者」の作成(変数)
フォームに表示するフィールドを定義します。
1.「保存」を選択するとページの下に次のようなタブが表示されます。「変数」タブを選択して「新規」ボタンを押下します。
2.次の画面のように項目「タイプ」を「参照」にします。「参照」とはテーブルを参照にすると言うことです。今回はServiceNowのユーザテーブルを参照するようにします。
「必須」をチェックして、順番に「10」を入力します。
「質問」タブを選択して項目「質問」に「Responsible」と入力します。
3.参照するテーブルを参照条件を指定します。
「タイプ仕様」タブを選択します。今回はServiceNowのユーザテーブルを参照するため、参照先を「sys_user」にします。プルダウンには複数のテーブル一覧が表示されるので「ユーザ[sys_user]」を選択します。
余談になりますが、アプリケーションナビゲータから「システム定義」を検索して「テーブル」を検索するとServiceNowで定義されているテーブル一覧が表示されます。また、「テーブルうと列」を選択すると既存テーブルの列の表示や新しいテーブルを定義することができます。
今回は有効な一般ユーザを対象にするので「参照修飾子の条件」に次のような条件を指定します。
列名 | 条件 | 値 | コメント |
---|---|---|---|
アクティブ | 次の値に等しい(=) | true | 有効なユーザのみ選択 |
内部統合ユーザ | 次の値に等しい(=) | false | システム用ユーザは対象外にする |
Webサービスへのアクセスのみ | 次の値に等しい(=) | false | API接続用ユーザは対象外にする |
4.「送信」ボタンを押下して設定を保存する。
5.カタログアイテム一覧に作成したフィール情報が表示されたことを確認する。
6.同様に副責任者のフィールドも作成します。
項目 | 値 | コメント |
---|---|---|
タイプ | 参照 | |
順番 | 20 | |
質問 | Subresponsible | |
参照 | ユーザ[sys_user] |
列名 | 条件 | 値 | コメント |
---|---|---|---|
アクティブ | 次の値に等しい(=) | true | 有効なユーザのみ選択 |
内部統合ユーザ | 次の値に等しい(=) | false | システム用ユーザは対象外にする |
Webサービスへのアクセスのみ | 次の値に等しい(=) | false | API接続用ユーザは対象外にする |
7.カタログアイテム一覧に次のように「Responsible」と「Subresponsible」が追加されていることを確認します。
責任者チェック(クライアントスクリプトの作成)
責任者を同じユーザを副責任者に指定することを禁止するスクリプトを作成します。UIポリシーではフィールド間の比較はできないのでスクリプトで行います。
1.「カタログクライアントスクリプト」タブを選択して「新規」ボタンを押下します。
2.次のように入力します。
項目 | 値 | コメント |
---|---|---|
名前 | Prohibit responsible = subresponsible | |
UIタイプ | すべて | ポータルでも有効にするため |
タイプ | onChange | 変更された場合にスクリプトを実行 |
変数名 | subresponsible | 監視するフィールド |
スクリプト
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
if (g_form.getValue("responsible") == newValue) {
g_form.addErrorMessage('Subresponsible user should be a different user from responsible');
g_form.clearValue('subresponsible');
}
}
3.内容を保存するために「送信」ボタンを押下してフォーム設定ページに戻ります。
動作確認
これまでに設定した内容を確認します。
1.フォーム設定ページの右上から「試行」ボタンを押下します。
2.項目Reponsibleと項目Subresponsibleに同じユーザを指定するとエラーメッセージが表示されることを確認します。
DNSレコード入力テーブルの作成(変数セット)
申請するDNSレコードの入力フィールドを作成します。
一つの申請で複数ドメインの変更を申請できるようにします。ServiceNowでは申請にテーブルを配置するには 変数セット を利用します。
1.フォーム設定ページ下から「変数セット」タブを選択して「新規」ボタンを押下します。
2.「Add」ボタンを押下します。
3.次のように入力します。
項目 | 値 |
---|---|
タイトル | DNS Submission |
内部名 | dns_submission |
説明 | DNS change request records |
4.このページから項目の設定も必要なので、ヘッダを右クリックして「保存」を選択します。ページ下にタブ項目が追加されます。
項目の作成
テーブルに処理、ドメイン名、IPアドレス、有効期限の列を追加します。
項目「処理」
1.「変数」タブを選択して「新規」ボタンを押下します。
2.フィールド「処理」はプルダウンから新規、更新、削除を選択できるようにします。
項目「タイプ」を「選択ボックス」にします。
項目「質問」に「Operation」と入力します。
3.このページからプルダウンの選択項目設定を行うためにヘッダ領域を右クリックして「保存」を選択します。ページの下に「質問の選択肢」が表示されます。
4.「質問の選択肢」にプルダウンに表示する値を定義します。
「新規」ボタンを押下します。
5.次のように入力します。
項目 | 値 | コメント |
---|---|---|
順番 | 100 | 表示する順 |
テキスト | Create | プルダウンに表示する文字列 |
値 | create | 選択した時に返す値 |
6.「送信」ボタンを押下して変数セット設定ページに戻ります。
7.同じような操作で「update」と「delete」を追加します。
update
項目 | 値 | コメント |
---|---|---|
順番 | 200 | 表示する順 |
テキスト | Update | プルダウンに表示する文字列 |
値 | update | 選択した時に返す値 |
delete
項目 | 値 | コメント |
---|---|---|
順番 | 300 | 表示する順 |
テキスト | Delete | プルダウンに表示する文字列 |
値 | delete | 選択した時に返す値 |
項目「ドメイン名」
登録するドメイン名フィールドを追加します。
1.変数セット設定ページ下の「変数」タブを選択して「新規」ボタンを押下します。
2.次のように設定します。
項目 | 値 |
---|---|
タイプ | 1行テキスト |
必須回答 | チェック |
順番 | 20 |
質問 | Domain Name |
名前 | domain_name |
3.ドメイン名は最初に定義した正規表現に適合しているかチェックします。
「タイプ仕様」タグを選択して、「妥当性確認用の正規表現」にドメイン名チェック用に定義した「Internal Domain Name」を選択します。
4.設定を保存して変数セット設定ページに戻るために「送信」ボタンを押下します。
項目「IPアドレス」
IPアドレス入力フィールドを定義します。設定手順はドメイン名を同様です。
1.「新規」ボタンを押下します。
2.次のように設定します。
項目 | 値 |
---|---|
タイプ | 1行テキスト |
必須回答 | チェック |
順番 | 30 |
質問 | IP Address |
名前 | ip_address |
3.IPアドレスも最初に定義した正規表見でチェックします。
「タイプ仕様」タブを選択して、項目「妥当性確認の正規表現」を「IPv4」にします。
4.設定を保存して変数セット設定ページに戻るために「送信」ボタンを押下します。
項目「有効日時」
ドメイン名/IPアドレスを有効にする日時フィールドを定義します。
1.「変数」タブから「新規」ボタンを押下します。
2.次のように設定します。
項目 | 値 |
---|---|
タイプ | 日付/時刻 |
必須回答 | チェック |
順番 | 40 |
質問 | Effective Date/Time |
名前 | effective_date_time |
3.必須フィールドにしたので、デフォルト値を設定します。
デフォルトは今日から2日後の日付にします。
「デフォルト値」タブを選択してデフォルト値に次のスクリプトを入力します。GlideDateTime()はServiceNowの日付クラスです。日付を指定していないので、今日の日付を取得します。gdt.addDaysLocalTime(2)の「2」は今日に2日足すと言う意味です。gdt.getLocalDate()はユーザプリフィールの形式で日付を取得します。
ユーザ毎に異なる日付形式を指定することができ、カレンダの形式が異なるます。.getLocaleDate()はServiceNowのシステム日付形式からユーザプロフィールの日付形式に変換して正しく日付が表示されるようにします。
祭日を抜いてビジネス日のみを対象にすることもできますが、本記事の内容を離れるので今回は割愛させていただきます。
javascript: var gdt = new GlideDateTime(); gdt.addDaysLocalTime(2); gdt.getLocalDate();
4.「送信」ボタンを押下して、変更セット設定ページに戻ります。
5.変数設定には次の4つの変数(フィールド)が定義されているはずです。
項目チェック
有効日時とドメイン名が正しいかチェックするスクリプトを作成します。フォーム自体にもスクリプトを定義することも出来ますが、テーブルの入力中にチェックを行うために変数セット設定ページからスクリプトを追加します。
有効日時のチェック(クライアントスクリプトの作成)
設定を有効にする日時が入力時間以降であることをチェックする。
UIポリシーでは今の時刻のチェックが正しく行われないので、クライアントスクリプトを作成します。
1.「カタログクライアントスクリプト」タブを選択します。
2.次のように設定します。
項目 | 値 | コメント |
---|---|---|
名前 | Validate effective date/time after now | |
タイプ | onChange | 変更された場合にスクリプトを実行 |
変数名 | effective_date_time | 監視するフィールド |
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
var currentTime = new Date();
var requestTime = new Date(newValue);
if (requestTime <= currentTime) {
g_form.showFieldMsg('effective_date_time', 'Please enter date after the current time', 'error');
}
}
3.「送信」ボタンを押下して、スクリプトを登録して変数設定設定ページに戻ります。
日本語訳
フォームに表示されている文字列を日本語に直します。翻訳対象は3種類あります。一つはスクリプトから表示されるメッセージ。一つはフィール名、一つは説明文です。
メッセージの日本語訳
フォーム及び変数セット内のスクリプトでエラーメッセージを表示しています。それらのメッセージをメッセージテーブル[sys_ui_message]に登録して、スクリプトでは.getMessage(<キー>)関数を利用するとユーザが選択している言語でメッセージが表示されるようになります。
1.メッセージテーブルを開きます。アプリケーションナビゲータから「メッセージ」を検索してシステムUI下の「メッセージ」を選択します。
テーブル名が分かる場合はアプリケーションナビゲータに「<直接テーブル名>.list」と入力するとテーブルを開きます。ここでは「sys_ui_message.list」と入力するとメッセージ一覧が表示されます。
2.スクリプトで利用しているメッセージを入力します。「.」など特別文字が含まれている場合はメッセージが正しく表示されないので、キーは特集文字を省いて短くして、表示するメッセージを項目「メッセージ」に記入します。
3.同じキーで日本語メッセージも登録する必要がありために、ヘッダ領域を右クリックして「保存」を選択します。「保存」を選択するとメッセージ一覧に移動しません。
4.内容を修正して日本語メッセージを入力します。
5.保存又は更新を選択すると英語メッセージを上書きします。新しいレコードを作成するにはヘッダ領域を右クリックして「挿入」を選択します。
6.同様な操作が次の英語及び日本語メッセージも登録します。
キー | English | 日本語 |
---|---|---|
Specified domain is already specified | There are duplicates domain. Please remove those before submitting | 既に同じ名前のドメイン処理があります。一つの申請には一つのドメイン操作は一回のみ許可しています。 |
Please enter date after the current time | Please enter date/time after the current time | 有効日は今の時間以降にしてください。 |
Subresponsible user should be a different user from responsible | Subresponsible user should be a different user from responsible. Please choose a different user | 副責任者は責任者と違う人を指定してください。 |
7.次にスクリプトを修正します。メッセージを表示している箇所を.getMessage('<メッセージキー>')に置き換えます。注意が必要なのは、一重引用符でメッセージキーを囲むことです。二重引用符では正しく表示されない場合があります。
ページ:Prohibit responsible = subresponsible
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
if (g_form.getValue("responsible") == newValue) {
g_form.addErrorMessage(getMessage('Subresponsible user should be a different user from responsible'));
g_form.clearValue('subresponsible');
}
}
ページ:Validate effective date/time after now
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
var currentTime = new Date();
var requestTime = new Date(newValue);
if (requestTime <= currentTime) {
g_form.showFieldMsg('effective_date_time', getMessage('Please enter date after the current time'), 'error');
}
}
ラベルの日本語訳
フィールド名を翻訳します。
1.ラベル名は「翻訳名/フィールド」に登録されています。アプリケーションナビゲータから「翻訳名」を検索して、「システムローカライズ」下の「翻訳名/フィールド」を選択します。
2.フィールド名は変数の項目「質問」に設定した値です。既に登録されていますでの一覧から設定した値を探して開きます。
列「更新済み」を選択して最近更新して順に並び替えると直前に作成したフィールド名が上に表示されます。
3.翻訳する行を選択します。日本語訳を項目「ラベル(翻訳)」に入力して「更新」ボタンを押下して一覧に戻ります。
4.同じ操作で他のフィールドも翻訳します。
5.フォームの変数一覧を開くと、変数名が日本語で表示されていることを確認できます。実は変数を開いて変数設定ページからも日本語名を入力することもできます。
説明文の日本語訳
フォーム設定した項目「簡単な説明」と正規表現のエラーメッセージを翻訳します。
1.アプリケーションナビゲータから「翻訳さあれた」を検索して、「システムローカライズ」下の「翻訳されたテキスト」を選択します。
2.列「値」に翻訳対象の文字列が表示されています。翻訳するには列「フィールド名」をクリックします。例えば「name」をクリックします。
3.説明文は英語ですが、言語は「日本語」とされています。言語が英語の場合は英語でメッセージを表示させるためには英語のメッセージを作成します。項目「言語」を「英語」に変えます。
4.日本語のメッセージも残すために、新しく英語のレコードを作成します。ヘッダ領域を右クリックして「挿入」を選択します。
5.同じ手順で翻訳が必要が文書の英語レコードを作成します。
6.言語が日本語のレコードを翻訳します。再び「フィールド名」列の行を選択します。
7.項目「値」に日本語に翻訳して「更新」ボタンを押下します。
8.同じ手順で他の日本語行の値も翻訳します。
9.フォームを開いて翻訳されていることを確認します。
10.「追加」ボタンを押下して、DNSレコード登録ダイアログも開き、日本語で表示されていることを確認します。
11.日本語が正しく表示されているか確認するために、フォーム設定ページから「試行」ボトンを押下してフォームをフォームを開きます。もし日本語が表示されていない場合はアプリケーションナビゲータに「cache.do」を入力してキャッシュを初期化した後に再びフォームを開き直します。
ポータル用の設定
申請ページの右側に価格などが表示されます。変更申請には価格などは不要なのでそれらのフィールドを非表示にします。
1.アプリケーションナビゲータから「アイテムの管理」を検索して、一覧から作成中のDNS申請を開きます。
2.「ポータルの設定」タブを選択して、項目「要求の方法」を「要求」に変更します。「必須の添付ファイル」以外はすべてチェックします。
3.設定を保存します。
4.確認します。「試行」ボタンを押下します。
5.フィールド「価格」などが表示されていないことを確認します。
テスト用データを作成する
現状ではDNS申請リクエストを作成することはできますが、実際のDNS変更処理は申請を参照して手動でDNS登録する必要があります。DNS登録処理も自動化するためには処理フローを定義します。フロー定義中にテストを行えるようにテスト用データを作成します。
1.フォーム設定ページを開いて「試行」ボタンを押下します。申請フォームが開くので適当にデータを入ロクします。テスト用に利用するのpで複数のドメインを登録します。
2.登録した後に「注文する」ボタンを押下します。(今回は割愛しますが、この「注文する」を変えることもできます。)
3.申請が登録されたページが表示されます。フローテストのために「要求番号」の値をメモして置きます。