RESTful API Guide

WD Fusion offers increased control and flexibility through a RESTful (REpresentational State Transfer) API. You can view the details of the available endpoints in the Automatically generated API Guide that is bundled with the installation.

Below are listed some example calls that you can use to guide the construction of your own scripts and API driven interactions.

1. Overview

Note the following:

  • All calls use the base URI:
    http(s)://<server-host>:8082/fusion/<resource>
    				
  • The internet media type of the data supported by the web service is application/xml.
  • The API is hypertext driven, using the following HTTP methods:
Type Action
POST Create a resource on the server
GET Retrieve a resource from the server
PUT Modify the state of a resource
DELETE Remove a resource


2. Examples

The following examples illustrate some simple use cases, most are direct calls through a web browser, although for deeper or interactive examples, a curl client may be used.

Mount point information

http://<WDFUSION.URL.COM>:8082/fusion/

Calling the mount point outputs infor

Output
<application>
		<applicationLocation>.</applicationLocation>
		<beaconPeriod>1000</beaconPeriod>
		<DConePort>6789</DConePort>
		<databaseLocation>/opt/fusion-server/dcone/db</databaseLocation>
		<httpPort>8082</httpPort>
		<httpsPort>0</httpsPort>
		<sslEnabled>false</sslEnabled>
</application>
	

Read more about the mount point /fusion/fs.

API documentation is still in development:
Note that the API documentation is incomplete and requires clarification of available endpoints.


List all replicated paths

http://<WDFUSION.URL.COM>:8082/fusion/fs
Output
<fsMap>
		<fsMapping>
		<uri>/repl1</uri>
		<membershipId>simpleMembership</membershipId>
		<familyRepresentativeId>
		<nodeId>wdfs1</nodeId>
		<dsmId>9bc8170e-e70d-11e4-95f9-ae4369cdbb06</dsmId>
		</familyRepresentativeId>
		<consistency>
		<state>UNKNOWN</state>
		<lastCheck>0</lastCheck>
		<nextCheck>1429587297002</nextCheck>
		</consistency>
		<isLeader>true</isLeader>
		<isWriter>true</isWriter>
		<gsn>407</gsn>
		</fsMapping>
</fsMap>

Return a specific replicated path

Output
<fsMapping>
<uri>/repl1</uri>
		<membershipId>simpleMembership</membershipId>
		<familyRepresentativeId>
		<nodeId>wdfs1</nodeId>
		<dsmId>9bc8170e-e70d-11e4-95f9-ae4369cdbb06</dsmId>
		</familyRepresentativeId>
		<consistency>
		<state>UNKNOWN</state>
		<lastCheck>0</lastCheck>
		<nextCheck>1429587297002</nextCheck>
		</consistency>
		<isLeader>true</isLeader>
		<isWriter>true</isWriter>
		<gsn>411</gsn>
</fsMapping>

Show inbound transfers

http://<WDFUSION.URL.COM:8082/fusion/fs/transfers

Show tasks

http://wdfusion8.ec2.wandisco.com:8082/fusion/tasks
Output
<tasks>
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="membershipProposalTaskDTO">
		<taskId>8391e4c7-e803-11e4-b2f1-c62bbea4984d</taskId>
		<timeCreated>1429606251844</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606252381</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>TASK_TYPE</key>
				<value>MEMBERSHIP_PROPOSAL_TASK_TYPE</value>
				</entry>
		</properties>
		<previousTask xsi:nil="true"/>
		<message>
		DeployFsStateMachineProposal. taskId: 8391e4c7-e803-11e4-b2f1-c62bbea4984d, creatorNodeId: wdfs1, membershipId: simpleMembership, dsmId: 8391e4c8-e803-11e4-b2f1-c62bbea4984d, uri: /repl1
		</message>
</task>
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="beaconTaskDTO">
		<taskId>6ea76f8d-e803-11e4-b2f1-c62bbea4984d</taskId>
		<timeCreated>1429606216697</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606216804</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>TASK_TYPE</key>
				<value>CREATE_MEMBERSHIP_TASK_TYPE</value>
				</entry>
		</properties>
		<previousTask xsi:nil="true"/>
		<message>
		CreateDistributedMembershipRequest New memberships:[Identity: simpleMembership Distinguished node: wdfs1@location1 Role: acceptor Node: wdfs1@location1 Node: wdfs2@location2 Role: learner Node: wdfs1@location1 Node: wdfs2@location2 Role: proposer Node: wdfs1@location1 Node: wdfs2@location2] TaskId 6ea76f8d-e803-11e4-b2f1-c62bbea4984d sent by Node wdfs1@location1
		</message>
		</task>
		<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ecosystemCommittedTaskDTO">
		<taskId>59ae52ca-e803-11e4-88e6-c228c4f805ee</taskId>
		<timeCreated>1429606182362</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606184504</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>induction.final.task.id</key>
				<value>59ae52c9-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>TASK_TYPE</key>
				<value>induction.commit.task</value>
				</entry>
				<entry>
				<key>induction.identity</key>
				<value>59ae52c1-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
		</properties>
		<previousTask>5a305481-e803-11e4-b2f1-c62bbea4984d</previousTask>
</task>
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="membershipProposalTaskDTO">
		<taskId>5a7d3c05-e803-11e4-b2f1-c62bbea4984d</taskId>
		<timeCreated>1429606182867</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606183518</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>induction.commit.task.id</key>
				<value>59ae52ca-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>inductor.start.task.id</key>
				<value>59ae52c7-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>TASK_TYPE</key>
				<value>induction.new.learner.task</value>
				</entry>
		</properties>
		<previousTask>5a305481-e803-11e4-b2f1-c62bbea4984d</previousTask>
		<message>
		AddNewNodesToEcosystem. taskId: 5a7d3c05-e803-11e4-b2f1-c62bbea4984d, creatorNodeId: wdfs1, newMembershipId: ECO-MEMBERSHIP-59addd8f-e803-11e4-88e6-c228c4f805ee, dsmId: ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d, newLearnerNodeIds: [wdfs2]
		</message>
</task>
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="beaconTaskDTO">
		<taskId>5a305481-e803-11e4-b2f1-c62bbea4984d</taskId>
		<timeCreated>1429606182362</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606182888</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>induction.commit.task.id</key>
				<value>59ae52ca-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>inductor.start.task.id</key>
				<value>59ae52c7-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>TASK_TYPE</key>
				<value>induction.create.new.membership</value>
				</entry>
		</properties>
		<previousTask>59ae52c7-e803-11e4-88e6-c228c4f805ee</previousTask>
		<nextTasks>59ae52ca-e803-11e4-88e6-c228c4f805ee</nextTasks>
		<nextTasks>5a7d3c05-e803-11e4-b2f1-c62bbea4984d</nextTasks>
		<message>
		CreateEcosystemMembership. taskId: 5a305481-e803-11e4-b2f1-c62bbea4984d, inductionIdentity: 59ae52c1-e803-11e4-88e6-c228c4f805ee, inductorIdentity: wdfs1, membership: Identity: ECO-MEMBERSHIP-59addd8f-e803-11e4-88e6-c228c4f805ee Distinguished node: wdfs1@location1 Role: acceptor Node: wdfs1@location1 Node: wdfs2@location2 Role: learner Node: wdfs1@location1 Node: wdfs2@location2 Role: proposer Node: wdfs1@location1 Node: wdfs2@location2, nodesInfo: [NodeInfo. nodeIdentity: wdfs1, nodeName: wdfs1, location: [Location: Identity:location1], ecosystemDsmId: ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d, ecosystemMembershipId: ECO-MEMBERSHIP-wdfs1, eventRoutes: [EventRoute:fusion-daily-01-vm1.qauk.wandisco.com:6789], NodeInfo. nodeIdentity: wdfs2, nodeName: wdfs2, location: [Location: Identity:location2], ecosystemDsmId: ECO-DSM-48b2c9fd-e803-11e4-88e6-c228c4f805ee, ecosystemMembershipId: ECO-MEMBERSHIP-wdfs2, eventRoutes: [EventRoute:fusion-daily-02-vm1.qauk.wandisco.com:6789]], inductionConfiguration: InductionConfiguration{inductorConfig={}, inducteeConfig={}, mergedConfig={}, new seed=59b9019c-e803-11e4-b2f1-c62bbea4984d}, commitTaskId: 59ae52ca-e803-11e4-88e6-c228c4f805ee
		</message>
</task>
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="dsmProposalTaskDTO">
		<taskId>59ae52c7-e803-11e4-88e6-c228c4f805ee</taskId>
		<timeCreated>1429606182053</timeCreated>
		<creatorNodeId>wdfs1</creatorNodeId>
		<timeUpdated>1429606182433</timeUpdated>
		<isDone>true</isDone>
		<aborted>false</aborted>
		<properties>
				<entry>
				<key>induction.inductee.nodes.info</key>
				<value>
				[NodeInfo. nodeIdentity: wdfs2, nodeName: wdfs2, location: [Location: Identity:location2], ecosystemDsmId: ECO-DSM-48b2c9fd-e803-11e4-88e6-c228c4f805ee, ecosystemMembershipId: ECO-MEMBERSHIP-wdfs2, eventRoutes: [EventRoute:fusion-daily-02-vm1.qauk.wandisco.com:6789]]
				</value>
				</entry>
				<entry>
				<key>induction.final.task.id</key>
				<value>59ae52c9-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>induction.commit.task.id</key>
				<value>59ae52ca-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>inductor.membership.id</key>
				<value>ECO-MEMBERSHIP-wdfs1</value>
				</entry>
				<entry>
				<key>inductor.identity</key>
				<value>wdfs1</value>
				</entry>
				<entry>
				<key>induction.eco.system.membership.id</key>
				<value>
				ECO-MEMBERSHIP-59addd8f-e803-11e4-88e6-c228c4f805ee
				</value>
				</entry>
				<entry>
				<key>inductee.membership.id</key>
				<value>ECO-MEMBERSHIP-wdfs2</value>
				</entry>
				<entry>
				<key>inductee.identity</key>
				<value>wdfs2</value>
				</entry>
				<entry>
				<key>remote.inductor.baton.beacon.task.id</key>
				<value>59ae52c5-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>TASK_TYPE</key>
				<value>INDUCTION_TASK</value>
				</entry>
				<entry>
				<key>inductor.prepare.asm.id</key>
				<value>59ae52c6-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>inductee.location.id</key>
				<value>location2</value>
				</entry>
				<entry>
				<key>induction.start.task.id</key>
				<value>59ad1a3e-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
				<entry>
				<key>induction.identity</key>
				<value>59ae52c1-e803-11e4-88e6-c228c4f805ee</value>
				</entry>
		</properties>
		<previousTask xsi:nil="true"/>
		<nextTasks>5a305481-e803-11e4-b2f1-c62bbea4984d</nextTasks>
		<message>
		PrepareInductorBaton[InductionBaton{taskId=59ae52c7-e803-11e4-88e6-c228c4f805ee, inductionIdentity=59ae52c1-e803-11e4-88e6-c228c4f805ee, dsmId=ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d, nodesInfo=[NodeInfo. nodeIdentity: wdfs2, nodeName: wdfs2, location: [Location: Identity:location2], ecosystemDsmId: ECO-DSM-48b2c9fd-e803-11e4-88e6-c228c4f805ee, ecosystemMembershipId: ECO-MEMBERSHIP-wdfs2, eventRoutes: [EventRoute:fusion-daily-02-vm1.qauk.wandisco.com:6789]], asmIdentity=59ae52c6-e803-11e4-88e6-c228c4f805ee}]
		</message>
		<dsmId>ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d</dsmId>
</task>
</tasks>		

Show memberships

http://<WDFUSION.URL.COM:8082/fusion/memberships

Show Nodes

http://<WDFUSION.URL.COM:8082/fusion/nodes
Output
<nodes>
	<node>
		<nodeIdentity>wdfs1</nodeIdentity>
		<locationIdentity>location1</locationIdentity>
		<isLocal>true</isLocal>
		<isUp>true</isUp>
		<isStopped>false</isStopped>
		<lastStatusChange>1429606531682</lastStatusChange>
		<attributes>
		<attribute>
		<key>eco.system.dsm.identity</key>
		<value>ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d</value>
		</attribute>
		<attribute>
		<key>node.name</key>
		<value>wdfs1</value>
		</attribute>
		<attribute>
		<key>eco.system.membership</key>
		<value>
		ECO-MEMBERSHIP-59addd8f-e803-11e4-88e6-c228c4f805ee
		</value>
		</attribute>
		</attributes>
	</node>
	<node>
		<nodeIdentity>wdfs2</nodeIdentity>
		<locationIdentity>location2</locationIdentity>
		<isLocal>false</isLocal>
		<isUp>true</isUp>
		<isStopped>false</isStopped>
		<lastStatusChange>1429606531699</lastStatusChange>
		<attributes>
		<attribute>
		<key>eco.system.dsm.identity</key>
		<value>ECO-DSM-24f8d34b-e803-11e4-b2f1-c62bbea4984d</value>
		</attribute>
		<attribute>
		<key>node.name</key>
		<value>wdfs2</value>
		</attribute>
		<attribute>
		<key>eco.system.membership</key>
		<value>
		ECO-MEMBERSHIP-59addd8f-e803-11e4-88e6-c228c4f805ee
		</value>
		</attribute>
		</attributes>
	</node>
</nodes>

Show replicated directories

http://<WDFUSION.URL.COM:8082/fusion/fs

Show a specific replicated directory

http://<WDFUSION.URL.COM:8082/dcone/fs?path=/repl1

Add another replicated directory

create a file called stateMachine.xml for use as payload in the REST API call. Note: membershipId should point to an existing membership:

stateMachine.xml

<fsMapping>
     <uri>/repl1</uri>
     <membershipId>simpleMembership</membershipId>
     <familyRepresentativeId>
          <nodeId>ohs1</nodeId>
     </familyRepresentativeId>
</fsMapping>

Curl Call to Add It:

curl -v -X POST -d@./stateMachine.xml -H "Content-Type: application/xml" http://<WDFUSION.URL.COM:8082/fusion/fs

Remove a directory from replication

curl -X DELETE http://<WDFUSION.URL.COM:8082/fusion/fs?path=/repl1

Consistency Check

You can trigger consistency checks through:

curl -v -X POST http://<WDFUSION.URL.COM:8082/fusion/fs/check?path=/folder_name

Take the taskId returned in the content-location header and view the report with (e.g.)

http://wdfusion2:8082/fusion/fs/check/b911241f-c430-11e4-9486-0ebe9eaaf785

The task can also be viewed as usual:

http://<WDFUSION.URL.COM:8082/dcone/task/b911241f-c430-11e4-9486-0ebe9eaaf785

Getting location information

http://wdfusion2:8082/fusion/locations
Output
<locations>
	<location>
		<locationIdentity>location2</locationIdentity>
		<isLocal>false</isLocal>
		<routes/>
		<attributes>
		<attribute>
		<key>location.property.longitude</key>
		<value>-1.4667</value>
		</attribute>
		<attribute>
		<key>location.property.latitude</key>
		<value>53.3833</value>
		</attribute>
		<attribute>
		<key>data.center</key>
		<value>dc2</value>
		</attribute>
		</attributes>
	</location>
	<location>
		<locationIdentity>location1</locationIdentity>
		<isLocal>true</isLocal>
		<routes/>
		<attributes>
		<attribute>
		<key>location.property.longitude</key>
		<value>-1.4667</value>
		</attribute>
		<attribute>
		<key>location.property.latitude</key>
		<value>53.3833</value>
		</attribute>
		<attribute>
		<key>data.center</key>
		<value>dc1</value>
		</attribute>
		</attributes>
	</location>
</locations>

Getting location information for a specific location

http://wdfusion2:8082/fusion/location/location1

Setting a nodes latitude and longitude create an xml file for the node e.g. virginia.xml

<attributes>
   <attribute>
      <key>location.property.longitude</key>
      <value>-76.453206</value>
   </attribute>
   <attribute>
      <key>location.property.latitude</key>
      <value>37.479401</value>
   </attribute>
</attributes>
curl -v -X PUT -d@./virginia.xml -H "Content-Type: application/xml"http://<WDFUSION.URL.COM:8082/fusion/location/[LocationID]/attributes"

where location1 is the actual location name

Stop and Start fusion server to see reflected in UI

Writers and Leaders

The writer is the 'elected leader' for the state machine replicas in a zone and the leader is the 'elected leader' for the entire set of state machine replicas.

There are as many writers as there are zones but only one leader.

Like a local leader vs global leader.