AppExchange - FMA を簡単にシミュレートする方法

## はじめに
AppExchange パートナープログラムでは、SaaS アプリケーション開発をサポートする多くの <a href="https://trailhead.salesforce.com/ja/trails/isv_developer_beginner/modules/isvforce_basics/units/isvforce_basics_tools_resources">機能やツール</a> を提供しています。今年は Salesforce DX を始めとして大幅な機能強化がいくつか続きましたが、そのうちのひとつが "機能管理アプリケーション (FMA)" だったと思います。

さて、この機能。先日 <a href="https://success.salesforce.com/sessions?eventId=a1Q3A00000stRRuUAM#/session/a2q3A000000GV0vQAG">Dreamforce セッション</a>で紹介されたばかりでまだ情報が少ないのですが、AppExchange パートナー様のバイブル <a href="https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/fma_manage_features.htm">ISVforce ガイド</a> によると、

>"機能管理アプリケーション (FMA) で拡張することで、ライセンス管理アプリケーション (LMA) を強化できます。FMA の正式リリースは、2017 年 10 月中旬です。

>Salesforce では、機能管理を導入したときのような、パイロットプログラムを実施することがあります。また、お客様に提供する前に機能をダークローンチして、その機能が本番環境でどのように動作するのかを確認することや、一部の組織に期間限定のトライアルとして機能を提供することもあります。そして時には、それらの機能の有効化総計値を追跡する必要があります。

>機能パラメータを使用することで、今まで公開されていなかったこの機能を、パートナー Ohana の皆様にご提供することになりました。FMA をライセンス管理組織 (LMO) にインストールします。FMA はライセンス管理アプリケーションを拡張するもので、LMA と同様に管理パッケージとして配布されます。"

と説明されています。

…何となく Salesforce のパイロットプログラムや <a href="https://help.salesforce.com/articleView?id=000220305&language=ja&type=1">機能有効化</a> と同じ事ができそう、とイメージはできますが、これではその実装方法はいまいちわかりません。また今回に限った話ではないのですが、そもそもこの機能を試すには LMO が必要だったり、FMA をインストールしたり、と開発者がとりあえず試すには高いハードルがあります。

そこで Salesforce DX を使って FMA をシミュレートして、この機能を体験してみたいと思います。

AppExchange アプリケーション開発者の方は必見です！

## シミュレート手順 （Dev, Build, and Test）

<a href="https://github.com/forcedotcom/project-force">このアプリとリポジトリ</a>は Salesforce DX で導入されたソース駆動型の開発フローで使用するように設計されています。

まずリポジトリをクローンします。

```
git clone https://github.com/forcedotcom/project-force
```

つぎにブランチを作成します。

```
cd ProjectForce	
git checkout -b myBranch
```

ブランチを作成した後は任意の変更を加えることができます。プロジェクトの構造内でJSONファイルを編集すると個人設定を反映できます。


ここからは Salesforce CLI を使用します。Dev Hub の作成および Salesforce CLI の設定は完了しているものと仮定します。（これらの作業を完了していない場合は <a href="https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_intro.htm">Salesforce DX 設定ガイド</a> を参照してください。）


スクラッチ組織を作成して、その組織を CLI コマンドのデフォルト組織として設定します。

```
sfdx force:org:create --setdefaultusername --setalias test --definitionfile config/project-scratch-def.json 
```

新しく作成したスクラッチ組織にメタデータをすべてプッシュします。

```
sfdx force:source:push
```

ブラウザでスクラッチ組織を開きます。

```
sfdx force:org:open
```

スクラッチ組織のユーザープロファイルのカスタムタブがデフォルトで有効であることを確認してください。（※権限セットはありません。）
![image](https://user-images.githubusercontent.com/45772/30082726-1464101c-9249-11e7-9cfb-d34e5889dccb.png)

プロファイルの設定が終わったら、Project Force をアプリケーションメニュー（Lightning Experience）またはアプリケーションドロップダウン（Salesforce Classic）から選択します。

[Projects] タブをクリックして、新しい `Project__c` オブジェクトを作成します。作成後に [Projects] タブをクリックすると一覧が表示されます。ここでレコードIDとレコード名の2つの列しかないことを確認してください。
![image](https://user-images.githubusercontent.com/45772/32290491-de179194-beff-11e7-8d77-567793c68e1a.png)

[Feature Console] タブをクリックします。 **Expense Tracking** を選択して、**Save** をクリックします。すると「Expense Tracking feature not currently licensed」とエラーメッセージが表示されます。
![image](https://user-images.githubusercontent.com/31550188/30071402-c6374a46-9223-11e7-931e-6ad24d2b6745.png)

これは期待通りの動きです。 `ExpenseTrackingPermitted` 機能パラメータは現在 false に設定されているためエラーが表示されます。

この機能パラメータは、通常、LMO で有効にするかどうか決まります。（本来であればこの値は FMA がインストールされた LMO を経由して変更します。）今回はスクラッチ組織でこのプロセスをシミュレートするために値を直接変更してみます。

`pf-app/ main/default/featureParameters` ディレクトリにある`ExpenseTrackingPermitted.featureParameterBoolean-meta.xml` ファイルを編集します。value を true に設定します。

```
<?xml version="1.0" encoding="UTF-8"?>
<PackageBooleanValue xmlns="http://soap.sforce.com/2006/04/metadata">
    <dataflowDirection>LmoToSubscriber</dataflowDirection>
    <masterLabel>Expense Tracking Permitted</masterLabel>
    <value>true</value>
</PackageBooleanValue>
```

ファイルを保存したら、ソースをスクラッチ組織にプッシュします。

```
sfdx force:source:push
```

スクラッチ組織に戻り、[Feature Console] タブをクリックします。 **Expense Tracking** 機能をチェックして **Save** をクリックしてください。今度は成功するはずです。
![image](https://user-images.githubusercontent.com/31550188/30071529-42e21eae-9224-11e7-9d87-d6b5b4e1e131.png)

[Projects] タブをクリックすると、一覧に **Expense Tracking** 列が表示されます。
![image](https://user-images.githubusercontent.com/45772/32290490-de0011f4-beff-11e7-8621-752fa5532d85.png)

[Feature Console] で **Expense Tracking** 機能を無効にすると、この列は再び非表示になります。また、これは **Budget Tracking** 機能でも同様です。

`FeatureManagement` Apexメソッドを呼び出して、 LMO-to-Subscriber 機能パラメータを編集することはできません。また Winter '18リリース以前は、 同じように Apex テストで LMO-to-Subscriber 機能パラメータは編集できませんでしたが、これからは、編集中の機能パラメータと同じ名前空間で Apex テストを実行できるようになりました。 このようにして、テスト実行の後にデータベースに保持されない Apex テストで、機能パラメータのさまざまな値を設定してテストができます。 デフォルト値はそのままで、機能や UI コンポーネントへのアクセスを許可する Boolean 型パラメータ、制限を設定する整数型パラメータ、有効期限となる日付型パラメータなどをテストできます。

このタイプのテストを行うサンプルは `pf-app/main/default/classes/FeatureConsoleTest.cls` です。 このような行は、機能を有効してから残りのテストを実行するのに役立ちます。

```
// enable the param so we can continue our testing
FeatureManagement.setPackageBooleanValue('ExpenseTrackingPermitted',true);
```

`FeatureConsoleTest` を実行します。

```
sfdx force:apex:test:run -n FeatureConsoleTest -r human
```
コマンドでテスト結果を確認できます。
![image](https://user-images.githubusercontent.com/31550188/30071140-f456df28-9222-11e7-8c6a-9e93af46492c.png)


## まとめ
Salesforce DX を使って LMO を使わずに FMA をシミュレートしてみる方法をご紹介しました。本来は下記のようなフローになるのですが、この方法を利用すると比較的簡単になったのではないかと思います。よろしければぜひお試しください！
![Managed_Packages_in_Salesforce_DX_and_Feature_Management__Read-Only_.png](https://qiita-image-store.s3.amazonaws.com/0/3461/54c95ff3-e654-db4b-687b-a884b06755c8.png)

これは <a href="https://qiita.com/advent-calendar/2017/salesforce-platform">Salesforce Platform Advent Calendar 2017 - Qiita</a> | 9日目の投稿です。

ハッピー・サイバーマンデー！

## リソース
_Github_: [Project Force App](https://github.com/forcedotcom/project-force)
（※原文と相違がある場合には原文の内容が優先されます）

_ISVforce ガイド_: [機能の管理]
(https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/fma_manage_features.htm)
_Salesforce DX 開発者ガイド_:[Salesforce Developer Experience による作業方法の変化]
(https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_intro.htm)
_Trailblazer Community_: [Feature Management]
(https://sfdc.co/fm)
_Dreamforce session_: [Managed Packages in Salesforce DX and Feature Management]
(https://success.salesforce.com/sessions?eventId=a1Q3A00000stRRuUAM#/session/a2q3A000000GV0vQAG)
_Trailhead_: [App Licensing and Customer Support for AppExchange]
(https://trailhead.salesforce.com/ja/trails/isv_developer_beginner/modules/appexchange_licensing)

## おまけ
<a href="https://partners.salesforce.com/0693A0000068eMpQAI">Partner Online "Replay" Guide Dreamforce 2017</a>