package info.frostfs.sdk; import frostfs.accounting.Types; import info.frostfs.sdk.dto.chain.Chain; import info.frostfs.sdk.dto.container.Container; import info.frostfs.sdk.dto.container.ContainerId; import info.frostfs.sdk.dto.netmap.NetmapSnapshot; import info.frostfs.sdk.dto.netmap.NodeInfo; import info.frostfs.sdk.dto.netmap.Version; import info.frostfs.sdk.dto.object.ObjectFrostFS; import info.frostfs.sdk.dto.object.ObjectHeader; import info.frostfs.sdk.dto.object.ObjectId; import info.frostfs.sdk.dto.session.SessionToken; import info.frostfs.sdk.exceptions.ProcessFrostFSException; import info.frostfs.sdk.jdo.ClientEnvironment; import info.frostfs.sdk.jdo.ClientSettings; import info.frostfs.sdk.jdo.NetworkSettings; import info.frostfs.sdk.jdo.parameters.CallContext; import info.frostfs.sdk.jdo.parameters.ape.PrmApeChainAdd; import info.frostfs.sdk.jdo.parameters.ape.PrmApeChainList; import info.frostfs.sdk.jdo.parameters.ape.PrmApeChainRemove; import info.frostfs.sdk.jdo.parameters.container.PrmContainerCreate; import info.frostfs.sdk.jdo.parameters.container.PrmContainerDelete; import info.frostfs.sdk.jdo.parameters.container.PrmContainerGet; import info.frostfs.sdk.jdo.parameters.container.PrmContainerGetAll; import info.frostfs.sdk.jdo.parameters.object.*; import info.frostfs.sdk.jdo.parameters.object.patch.PrmObjectPatch; import info.frostfs.sdk.jdo.parameters.object.patch.PrmRangeGet; import info.frostfs.sdk.jdo.parameters.object.patch.PrmRangeHashGet; import info.frostfs.sdk.jdo.parameters.session.PrmSessionCreate; import info.frostfs.sdk.jdo.result.ObjectHeaderResult; import info.frostfs.sdk.pool.SessionCache; import info.frostfs.sdk.pool.WrapperPrm; import info.frostfs.sdk.services.CommonClient; import info.frostfs.sdk.services.impl.*; import info.frostfs.sdk.services.impl.interceptor.Configuration; import info.frostfs.sdk.services.impl.interceptor.MonitoringClientInterceptor; import info.frostfs.sdk.services.impl.rwhelper.ObjectWriter; import info.frostfs.sdk.services.impl.rwhelper.RangeReader; import info.frostfs.sdk.utils.Validator; import io.grpc.Channel; import io.grpc.ClientInterceptors; import io.grpc.ManagedChannel; import java.util.List; import static info.frostfs.sdk.constants.ErrorConst.VERSION_UNSUPPORTED_TEMPLATE; import static info.frostfs.sdk.tools.GrpcClient.initGrpcChannel; import static java.util.Objects.nonNull; public class FrostFSClient implements CommonClient { private static final MonitoringClientInterceptor MONITORING_CLIENT_INTERCEPTOR = MonitoringClientInterceptor.create(Configuration.allMetrics()); private final ContainerClientImpl containerClientImpl; private final ObjectClientImpl objectClientImpl; private final ApeManagerClientImpl apeManagerClient; private final NetmapClientImpl netmapClientImpl; private final SessionClientImpl sessionClientImpl; private final ObjectToolsImpl objectToolsImpl; private final AccountingClientImpl accountingClient; private final ManagedChannel channel; public FrostFSClient(ClientSettings clientSettings) { Validator.validate(clientSettings); this.channel = nonNull(clientSettings.getChannel()) ? clientSettings.getChannel() : initGrpcChannel(clientSettings); Channel interceptChannel = ClientInterceptors.intercept(channel, MONITORING_CLIENT_INTERCEPTOR); ClientEnvironment clientEnvironment = new ClientEnvironment( clientSettings.getKey(), interceptChannel, new Version(), this, new SessionCache(0) ); Validator.validate(clientEnvironment); this.containerClientImpl = new ContainerClientImpl(clientEnvironment); this.objectClientImpl = new ObjectClientImpl(clientEnvironment); this.apeManagerClient = new ApeManagerClientImpl(clientEnvironment); this.netmapClientImpl = new NetmapClientImpl(clientEnvironment); this.sessionClientImpl = new SessionClientImpl(clientEnvironment); this.objectToolsImpl = new ObjectToolsImpl(clientEnvironment); this.accountingClient = new AccountingClientImpl(clientEnvironment); checkFrostFSVersionSupport(clientEnvironment.getVersion()); } public FrostFSClient(WrapperPrm prm, SessionCache cache) { this.channel = initGrpcChannel(prm.getAddress()); Channel interceptChannel = ClientInterceptors.intercept(channel, MONITORING_CLIENT_INTERCEPTOR); ClientEnvironment clientEnvironment = new ClientEnvironment(prm.getKey(), interceptChannel, new Version(), this, cache); Validator.validate(clientEnvironment); this.containerClientImpl = new ContainerClientImpl(clientEnvironment); this.objectClientImpl = new ObjectClientImpl(clientEnvironment); this.apeManagerClient = new ApeManagerClientImpl(clientEnvironment); this.netmapClientImpl = new NetmapClientImpl(clientEnvironment); this.sessionClientImpl = new SessionClientImpl(clientEnvironment); this.objectToolsImpl = new ObjectToolsImpl(clientEnvironment); this.accountingClient = new AccountingClientImpl(clientEnvironment); checkFrostFSVersionSupport(clientEnvironment.getVersion()); } private void checkFrostFSVersionSupport(Version version) { var localNodeInfo = netmapClientImpl.getLocalNodeInfo(new CallContext()); if (!localNodeInfo.getVersion().isSupported(version)) { throw new ProcessFrostFSException( String.format(VERSION_UNSUPPORTED_TEMPLATE, localNodeInfo.getVersion()) ); } } @Override public Container getContainer(PrmContainerGet args, CallContext ctx) { return containerClientImpl.getContainer(args, ctx); } @Override public List listContainers(PrmContainerGetAll args, CallContext ctx) { return containerClientImpl.listContainers(args, ctx); } @Override public ContainerId createContainer(PrmContainerCreate args, CallContext ctx) { return containerClientImpl.createContainer(args, ctx); } @Override public void deleteContainer(PrmContainerDelete args, CallContext ctx) { containerClientImpl.deleteContainer(args, ctx); } @Override public ObjectHeaderResult getObjectHead(PrmObjectHeadGet args, CallContext ctx) { return objectClientImpl.getObjectHead(args, ctx); } @Override public ObjectFrostFS getObject(PrmObjectGet args, CallContext ctx) { return objectClientImpl.getObject(args, ctx); } @Override public ObjectWriter putObject(PrmObjectPut args, CallContext ctx) { return objectClientImpl.putObject(args, ctx); } @Override public ObjectId putClientCutObject(PrmObjectClientCutPut args, CallContext ctx) { return objectClientImpl.putClientCutObject(args, ctx); } @Override public ObjectId putSingleObject(PrmObjectSinglePut args, CallContext ctx) { return objectClientImpl.putSingleObject(args, ctx); } @Override public void deleteObject(PrmObjectDelete args, CallContext ctx) { objectClientImpl.deleteObject(args, ctx); } @Override public Iterable searchObjects(PrmObjectSearch args, CallContext ctx) { return objectClientImpl.searchObjects(args, ctx); } @Override public RangeReader getRange(PrmRangeGet args, CallContext ctx) { return objectClientImpl.getRange(args, ctx); } @Override public byte[][] getRangeHash(PrmRangeHashGet args, CallContext ctx) { return objectClientImpl.getRangeHash(args, ctx); } @Override public ObjectId patchObject(PrmObjectPatch args, CallContext ctx) { return objectClientImpl.patchObject(args, ctx); } @Override public byte[] addChain(PrmApeChainAdd args, CallContext ctx) { return apeManagerClient.addChain(args, ctx); } @Override public void removeChain(PrmApeChainRemove args, CallContext ctx) { apeManagerClient.removeChain(args, ctx); } @Override public List listChains(PrmApeChainList args, CallContext ctx) { return apeManagerClient.listChains(args, ctx); } @Override public NetmapSnapshot getNetmapSnapshot(CallContext ctx) { return netmapClientImpl.getNetmapSnapshot(ctx); } @Override public NodeInfo getLocalNodeInfo(CallContext ctx) { return netmapClientImpl.getLocalNodeInfo(ctx); } @Override public NetworkSettings getNetworkSettings(CallContext ctx) { return netmapClientImpl.getNetworkSettings(ctx); } @Override public SessionToken createSession(PrmSessionCreate args, CallContext ctx) { return sessionClientImpl.createSession(args, ctx); } public frostfs.session.Types.SessionToken createSessionInternal(PrmSessionCreate args, CallContext ctx) { return sessionClientImpl.createSessionInternal(args, ctx); } @Override public ObjectId calculateObjectId(ObjectHeader header) { return objectToolsImpl.calculateObjectId(header); } @Override public Types.Decimal getBalance(CallContext ctx) { return accountingClient.getBalance(ctx); } @Override public String dial(CallContext ctx) { accountingClient.getBalance(ctx); return null; } public void close() { channel.shutdown(); } }