2016-12-23 18:35:37 +00:00
|
|
|
package ipfscluster
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
import (
|
2017-02-02 22:52:06 +00:00
|
|
|
"errors"
|
2017-01-30 12:12:25 +00:00
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
cid "github.com/ipfs/go-cid"
|
2017-01-30 12:12:25 +00:00
|
|
|
peer "github.com/libp2p/go-libp2p-peer"
|
|
|
|
)
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-01-25 11:14:39 +00:00
|
|
|
// RPCAPI is a go-libp2p-gorpc service which provides the internal ipfs-cluster
|
2017-01-26 18:59:31 +00:00
|
|
|
// API, which enables components and cluster peers to communicate and
|
2016-12-28 15:25:24 +00:00
|
|
|
// request actions from each other.
|
|
|
|
//
|
|
|
|
// The RPC API methods are usually redirects to the actual methods in
|
|
|
|
// the different components of ipfs-cluster, with very little added logic.
|
|
|
|
// Refer to documentation on those methods for details on their behaviour.
|
2016-12-23 18:35:37 +00:00
|
|
|
type RPCAPI struct {
|
|
|
|
cluster *Cluster
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// CidArg is an arguments that carry a Cid. It may carry more things in the
|
|
|
|
// future.
|
2016-12-23 18:35:37 +00:00
|
|
|
type CidArg struct {
|
|
|
|
Cid string
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// NewCidArg returns a CidArg which carries the given Cid. It panics if it is
|
|
|
|
// nil.
|
2016-12-23 18:35:37 +00:00
|
|
|
func NewCidArg(c *cid.Cid) *CidArg {
|
2016-12-28 15:25:24 +00:00
|
|
|
if c == nil {
|
|
|
|
panic("Cid cannot be nil")
|
|
|
|
}
|
2016-12-23 18:35:37 +00:00
|
|
|
return &CidArg{c.String()}
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// CID decodes and returns a Cid from a CidArg.
|
2016-12-23 18:35:37 +00:00
|
|
|
func (arg *CidArg) CID() (*cid.Cid, error) {
|
|
|
|
c, err := cid.Decode(arg.Cid)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Cluster components methods
|
|
|
|
*/
|
|
|
|
|
2017-01-25 17:07:19 +00:00
|
|
|
// ID runs Cluster.ID()
|
2017-01-26 18:59:31 +00:00
|
|
|
func (api *RPCAPI) ID(in struct{}, out *IDSerial) error {
|
|
|
|
id := api.cluster.ID().ToSerial()
|
|
|
|
*out = id
|
2017-01-24 15:19:23 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// Pin runs Cluster.Pin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) Pin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.Pin(c)
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// Unpin runs Cluster.Unpin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) Unpin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.Unpin(c)
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// PinList runs Cluster.Pins().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) PinList(in struct{}, out *[]string) error {
|
|
|
|
cidList := api.cluster.Pins()
|
|
|
|
cidStrList := make([]string, 0, len(cidList))
|
|
|
|
for _, c := range cidList {
|
|
|
|
cidStrList = append(cidStrList, c.String())
|
|
|
|
}
|
|
|
|
*out = cidStrList
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// Version runs Cluster.Version().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) Version(in struct{}, out *string) error {
|
|
|
|
*out = api.cluster.Version()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-01-26 18:59:31 +00:00
|
|
|
// Peers runs Cluster.Peers().
|
|
|
|
func (api *RPCAPI) Peers(in struct{}, out *[]IDSerial) error {
|
|
|
|
peers := api.cluster.Peers()
|
|
|
|
var sPeers []IDSerial
|
|
|
|
for _, p := range peers {
|
|
|
|
sPeers = append(sPeers, p.ToSerial())
|
|
|
|
}
|
|
|
|
*out = sPeers
|
2016-12-23 18:35:37 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
// PeerAdd runs Cluster.PeerAdd().
|
|
|
|
func (api *RPCAPI) PeerAdd(in MultiaddrSerial, out *IDSerial) error {
|
|
|
|
addr := in.ToMultiaddr()
|
|
|
|
id, err := api.cluster.PeerAdd(addr)
|
|
|
|
*out = id.ToSerial()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// PeerRemove runs Cluster.PeerRm().
|
|
|
|
func (api *RPCAPI) PeerRemove(in peer.ID, out *struct{}) error {
|
|
|
|
return api.cluster.PeerRemove(in)
|
|
|
|
}
|
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
// Join runs Cluster.Join().
|
|
|
|
func (api *RPCAPI) Join(in MultiaddrSerial, out *struct{}) error {
|
|
|
|
addr := in.ToMultiaddr()
|
|
|
|
err := api.cluster.Join(addr)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// StatusAll runs Cluster.StatusAll().
|
|
|
|
func (api *RPCAPI) StatusAll(in struct{}, out *[]GlobalPinInfo) error {
|
|
|
|
pinfo, err := api.cluster.StatusAll()
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// Status runs Cluster.Status().
|
|
|
|
func (api *RPCAPI) Status(in *CidArg, out *GlobalPinInfo) error {
|
2016-12-23 18:35:37 +00:00
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-01-25 18:38:23 +00:00
|
|
|
pinfo, err := api.cluster.Status(c)
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// SyncAllLocal runs Cluster.SyncAllLocal().
|
|
|
|
func (api *RPCAPI) SyncAllLocal(in struct{}, out *[]PinInfo) error {
|
|
|
|
pinfo, err := api.cluster.SyncAllLocal()
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// SyncLocal runs Cluster.SyncLocal().
|
|
|
|
func (api *RPCAPI) SyncLocal(in *CidArg, out *PinInfo) error {
|
2016-12-23 18:35:37 +00:00
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-01-25 18:38:23 +00:00
|
|
|
pinfo, err := api.cluster.SyncLocal(c)
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// SyncAll runs Cluster.SyncAll().
|
|
|
|
func (api *RPCAPI) SyncAll(in struct{}, out *[]GlobalPinInfo) error {
|
|
|
|
pinfo, err := api.cluster.SyncAll()
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// Sync runs Cluster.Sync().
|
|
|
|
func (api *RPCAPI) Sync(in *CidArg, out *GlobalPinInfo) error {
|
2016-12-23 18:35:37 +00:00
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-01-25 18:38:23 +00:00
|
|
|
pinfo, err := api.cluster.Sync(c)
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// StateSync runs Cluster.StateSync().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) StateSync(in struct{}, out *[]PinInfo) error {
|
|
|
|
pinfo, err := api.cluster.StateSync()
|
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// Recover runs Cluster.Recover().
|
|
|
|
func (api *RPCAPI) Recover(in *CidArg, out *GlobalPinInfo) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
pinfo, err := api.cluster.Recover(c)
|
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
/*
|
|
|
|
Tracker component methods
|
|
|
|
*/
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// Track runs PinTracker.Track().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) Track(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.tracker.Track(c)
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// Untrack runs PinTracker.Untrack().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) Untrack(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.tracker.Untrack(c)
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// TrackerStatusAll runs PinTracker.StatusAll().
|
|
|
|
func (api *RPCAPI) TrackerStatusAll(in struct{}, out *[]PinInfo) error {
|
|
|
|
*out = api.cluster.tracker.StatusAll()
|
2016-12-23 18:35:37 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// TrackerStatus runs PinTracker.Status().
|
|
|
|
func (api *RPCAPI) TrackerStatus(in *CidArg, out *PinInfo) error {
|
2016-12-23 18:35:37 +00:00
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-01-25 18:38:23 +00:00
|
|
|
pinfo := api.cluster.tracker.Status(c)
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = pinfo
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
// TrackerRecover runs PinTracker.Recover().
|
|
|
|
func (api *RPCAPI) TrackerRecover(in *CidArg, out *PinInfo) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
pinfo, err := api.cluster.tracker.Recover(c)
|
|
|
|
*out = pinfo
|
|
|
|
return err
|
|
|
|
}
|
2016-12-23 18:35:37 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
IPFS Connector component methods
|
|
|
|
*/
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// IPFSPin runs IPFSConnector.Pin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) IPFSPin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.ipfs.Pin(c)
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// IPFSUnpin runs IPFSConnector.Unpin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) IPFSUnpin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.ipfs.Unpin(c)
|
|
|
|
}
|
|
|
|
|
2017-01-25 17:07:19 +00:00
|
|
|
// IPFSPinLsCid runs IPFSConnector.PinLsCid().
|
|
|
|
func (api *RPCAPI) IPFSPinLsCid(in *CidArg, out *IPFSPinStatus) error {
|
2016-12-23 18:35:37 +00:00
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-01-25 17:07:19 +00:00
|
|
|
b, err := api.cluster.ipfs.PinLsCid(c)
|
2016-12-23 18:35:37 +00:00
|
|
|
*out = b
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-01-25 17:07:19 +00:00
|
|
|
// IPFSPinLs runs IPFSConnector.PinLs().
|
|
|
|
func (api *RPCAPI) IPFSPinLs(in struct{}, out *map[string]IPFSPinStatus) error {
|
|
|
|
m, err := api.cluster.ipfs.PinLs()
|
|
|
|
*out = m
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
/*
|
|
|
|
Consensus component methods
|
|
|
|
*/
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// ConsensusLogPin runs Consensus.LogPin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) ConsensusLogPin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.consensus.LogPin(c)
|
|
|
|
}
|
|
|
|
|
2016-12-28 15:25:24 +00:00
|
|
|
// ConsensusLogUnpin runs Consensus.LogUnpin().
|
2016-12-23 18:35:37 +00:00
|
|
|
func (api *RPCAPI) ConsensusLogUnpin(in *CidArg, out *struct{}) error {
|
|
|
|
c, err := in.CID()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return api.cluster.consensus.LogUnpin(c)
|
|
|
|
}
|
2017-01-30 12:12:25 +00:00
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
// ConsensusLogAddPeer runs Consensus.LogAddPeer().
|
|
|
|
func (api *RPCAPI) ConsensusLogAddPeer(in MultiaddrSerial, out *struct{}) error {
|
|
|
|
addr := in.ToMultiaddr()
|
|
|
|
return api.cluster.consensus.LogAddPeer(addr)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ConsensusLogRmPeer runs Consensus.LogRmPeer().
|
|
|
|
func (api *RPCAPI) ConsensusLogRmPeer(in peer.ID, out *struct{}) error {
|
|
|
|
return api.cluster.consensus.LogRmPeer(in)
|
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
/*
|
|
|
|
Peer Manager methods
|
|
|
|
*/
|
|
|
|
|
|
|
|
// PeerManagerAddPeer runs peerManager.addPeer().
|
2017-02-02 22:52:06 +00:00
|
|
|
func (api *RPCAPI) PeerManagerAddPeer(in MultiaddrSerial, out *struct{}) error {
|
|
|
|
addr := in.ToMultiaddr()
|
|
|
|
err := api.cluster.peerManager.addPeer(addr)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// PeerManagerAddFromMultiaddrs runs peerManager.addFromMultiaddrs().
|
|
|
|
func (api *RPCAPI) PeerManagerAddFromMultiaddrs(in MultiaddrsSerial, out *struct{}) error {
|
|
|
|
addrs := in.ToMultiaddrs()
|
|
|
|
err := api.cluster.peerManager.addFromMultiaddrs(addrs)
|
2017-01-30 12:12:25 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
// PeerManagerRmPeerShutdown runs peerManager.rmPeer().
|
|
|
|
func (api *RPCAPI) PeerManagerRmPeerShutdown(in peer.ID, out *struct{}) error {
|
|
|
|
return api.cluster.peerManager.rmPeer(in, true)
|
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
// PeerManagerRmPeer runs peerManager.rmPeer().
|
|
|
|
func (api *RPCAPI) PeerManagerRmPeer(in peer.ID, out *struct{}) error {
|
2017-02-02 22:52:06 +00:00
|
|
|
return api.cluster.peerManager.rmPeer(in, false)
|
2017-01-30 12:12:25 +00:00
|
|
|
}
|
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
/*
|
|
|
|
Other
|
|
|
|
*/
|
2017-01-30 12:12:25 +00:00
|
|
|
|
2017-02-02 22:52:06 +00:00
|
|
|
// RemoteMultiaddrForPeer returns the multiaddr of a peer as seen by this peer.
|
|
|
|
// This is necessary for a peer to figure out which of its multiaddresses the
|
|
|
|
// peers are seeing (also when crossing NATs). It should be called from
|
|
|
|
// the peer the IN parameter indicates.
|
|
|
|
func (api *RPCAPI) RemoteMultiaddrForPeer(in peer.ID, out *MultiaddrSerial) error {
|
|
|
|
conns := api.cluster.host.Network().ConnsToPeer(in)
|
|
|
|
if len(conns) == 0 {
|
|
|
|
return errors.New("no connections to: " + in.Pretty())
|
|
|
|
}
|
|
|
|
*out = MultiaddrToSerial(multiaddrJoin(conns[0].RemoteMultiaddr(), in))
|
2017-01-30 12:12:25 +00:00
|
|
|
return nil
|
|
|
|
}
|