outputLocation is not a valid S3 path. Athena Exception - c#

I am trying to execute athena query using c# athena driver.
Amazon.Athena.Model.ResultConfiguration resultConfig = new Amazon.Athena.Model.ResultConfiguration();
resultConfig.OutputLocation = "https://s3.us-east-2.amazonaws.com/testbucket/one/2018-02-06/";
//other inputs i have tried
//"s3://testbucket/one/2018-02-06/"
//testbucket
//Populate the request object
Amazon.Athena.Model.StartQueryExecutionRequest queryExec = new Amazon.Athena.Model.StartQueryExecutionRequest();
queryExec.QueryString = query.QueryString;
queryExec.QueryExecutionContext = queryExecutionContext;
queryExec.ResultConfiguration = resultConfig;
StartQueryExecutionResponse athenaResponse = athenaClient.StartQueryExecution(queryExec);//throws exception
Exception for different cases:
outputLocation is not a valid S3 path. Provided https://s3.us-east-2.amazonaws.com/testbucket/one/2018-02-06/
Unable to verify/create output bucket testbucket. Provided s3://testbucket/one/2018-02-06/
Unable to verify/create output bucket testbucket. Provided testbucket
Can someone help me out with the right s3 format?
Thanks in advance.

The output location needs to be in the following format:
s3://{bucketname}/{path}
In your case this would lead to the following location:
resultConfig.OutputLocation = "s3://testbucket/one/2018-02-06/";

Amazon.Athena.AmazonAthenaClient _client = new Amazon.Athena.AmazonAthenaClient(AwsAccessKeyId, AwsSecretAccessKey, EndPoint);
Amazon.Athena.Model.ResultConfiguration resultConfig = new Amazon.Athena.Model.ResultConfiguration();
resultConfig.OutputLocation = "s3://"+BucketName+"/key1/";
string query = "SELECT * FROM copalanadev.logs";
//Populate the request object
Amazon.Athena.Model.StartQueryExecutionRequest queryExec = new Amazon.Athena.Model.StartQueryExecutionRequest();
queryExec.QueryString = query;
//queryExec.QueryExecutionContext = queryExecutionContext;
queryExec.ResultConfiguration = resultConfig;
StartQueryExecutionResponse athenaResponse = _client.StartQueryExecution(queryExec);//throws exception

Related

Nethereuem SendTransactionAsync from my C# Web API fails with transaction type not supported: eth_sendRawTransaction

I'm working on integrating Nethereum into my .NET 5 C# API and can do read queries against my chosen blockchain (BSC), but cannot get a SendTransactionAsync or SendRequestAsync to successfully execute. I'm consistently getting the following exception:
Nethereum.JsonRpc.Client.RpcResponseException: 'transaction type not supported: eth_sendRawTransaction'.
Here are code snippets of what I have tried:
// Setup
var account = new Account(privateKey, chainId);
var rpcUrl = "https://data-seed-prebsc-2-s2.binance.org:8545/";
var client = new RpcClient(new Uri(rpcUrl));
var web3 = new Web3(account, client);
var mediaTokenAddress = "0x1E4d1BFDa5d55C2176E9E3e8367BAe720525a8e0";
var mtSvc = new MediaTokenService(web3, mediaTokenAddress);
var mintMsg = new MintNftFunction
{
FromAddress = account.Address,
Recipient = "REDACTED",
MetadataHash = "TestMetaDataHash",
MediaHash = "TestMediaHash",
SeasonId = 1
};
// Attempt #1: Using C# classes generated by the Nethereum CodeGen library
var txReceipt = await mtSvc.MintNftRequestAndWaitForReceiptAsync(mintMsg);
// Attempt #2
var txHandler = web3.Eth.GetContractTransactionHandler<MintNftFunction>();
var signedTx = await txHandler.SignTransactionAsync(mediaTokenAddress, mintMsg);
var txReceipt = await web3.Eth.Transactions.SendTransaction.SendRequestAsync(signedTx);
// Attempt #3
var txInput = mintMsg.CreateTransactionInput(mediaTokenAddress);
var txReceipt = await web3.Eth.TransactionManager.SendTransactionAsync(txInput);
Is there a configuration step I'm missing? Any help is appreciated!
EDIT: I want to call a contract method that will change values within the contract, rather than sending currency. So I need help figuring out how to do that.
For those that come across this issue, I resolved it by setting the following flag on my web3 instance:
web3.TransactionManager.UseLegacyAsDefault = true;
If there is a way to do what I need without setting this flag, please feel free to leave a comment.
Here is an example of how I do this with Nethereum
var web3 = new Nethereum.Web3.Web3("YOUR_NODE_ADDRESS");
var privateKey = "someprivatekey";
var senderAddress = "0x..."; // put actual sender address
var receiveAddress = "0x..."; //put actual receiver address
var txCount = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(senderAddress);
double sendAmount = 5.09540000; //this is ETH
var amountInWei = Web3.Convert.ToWei(sendAmount);
//600 GWEI = 0.000000600
//60 GWEI = 0.000000060
var gwei = 147; // this is 0.000000147 ETH. You will want to calculate this based on network fees
var gasPrice = Web3.Convert.ToWei(0.000000001 * gwei);
var gasLimit = Web3.Convert.ToWei(0.000000000000021);
var encoded = Web3.OfflineTransactionSigner.SignTransaction(privateKey, receiveAddress, amountInWei, txCount.Value, gasPrice, gasLimit);
//This is what prompts the transactions
Web3.OfflineTransactionSigner.GetSenderAddress(encoded).Dump();
//TX Returns from this action
var txId = await web3.Eth.Transactions.SendRawTransaction.SendRequestAsync("0x" + encoded);
//Dump out the TX if successful
txId.Dump();
I've used this many times and it has worked for me just fine.

Unable to add lambda target in scheduled rule in AWS cloudwatch

I'm Actually Creating a Sheduled Rule in aws cloudwatch in .net as lambda target but im unable to add my lambda as a target.
what is wrong here
`var region = RegionEndpoint.GetBySystemName("us-east-2");`
`AmazonCloudWatchEventsClient client = new AmazonCloudWatchEventsClient(region);`
`AmazonLambdaClient lambda = new AmazonLambdaClient();`
`var putRuleRequest = new PutRuleRequest`
`{`
` Name = "Rule1check",`
`ScheduleExpression = "cron(0 11 24 * ? 2020)",`
`State = RuleState.ENABLED,`
`};`
`//var putTargetRequest = "EC2 RebootInstances API call`
`var putRuleResponse = client.PutRuleAsync(putRuleRequest);`
`AddPermissionRequest lambdaparam = new AddPermissionRequest`
`{`
` Action = "lambda:InvokeFunction",`
`FunctionName = "stop_ec2",`
`Principal = "events.amazonaws.com",`
`SourceArn = putRuleResponse.ToString(),`
`StatementId = "ID-1"`
`};`
`lambda.AddPermissionAsync(lambdaparam);`
`var putTargetRequest = new PutTargetsRequest`
` {`
`Rule = "Rule1check",`
`Targets =`
`{`
`new Target { Arn = "arn:aws:lambda:us-east-2:394451858625:function:stop_ec2",`
`Id = "myCloudWatchEventsTarget",`
`Input = "{\"region\": \"us-east-2\",\"instances\": \"*******\"}"`
` }`
` }`
`};`
`client.PutTargetsAsync(putTargetRequest);`
You have a few problems here.
SourceArn = putRuleResponse.ToString(). The PutRuleResponse object contains a RuleArn property. That's what you should use. SourceArn = putRuleResponse.RuleArn.
client.PutRuleAsync(putRuleRequest) is an async call, but you aren't awaiting it. As a result you are getting a Task<PutRuleResponse> back, not a PutRuleResponse, and you're getting it before the operation is likely completed.
You aren't awaiting anything, which could be an issue when doing things with dependencies.

How to create a TensorProto in c#?

This is a snipped of the c# client I created to query the tensorflow server I set up using this tutorial: https://tensorflow.github.io/serving/serving_inception.html
var channel = new Channel("TFServer:9000", ChannelCredentials.Insecure);
var request = new PredictRequest();
request.ModelSpec = new ModelSpec();
request.ModelSpec.Name = "inception";
var imgBuffer = File.ReadAllBytes(#"sample.jpg");
ByteString jpeg = ByteString.CopyFrom(imgBuffer, 0, imgBuffer.Length);
var jpgeproto = new TensorProto();
jpgeproto.StringVal.Add(jpeg);
jpgeproto.Dtype = DataType.DtStringRef;
request.Inputs.Add("images", jpgeproto); // new TensorProto{TensorContent = jpeg});
PredictionClient client = new PredictionClient(channel);
I found out that most classes needed to be generated from proto files using protoc
The only thing which I cant find is how to construct the TensorProto. The error I keep getting is : Additional information: Status(StatusCode=InvalidArgument, Detail="tensor parsing error: images")
There is a sample client (https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_client.py) byt my Python skills are not sufficient to understand the last bit.
I also implemented that client in another language (Java).
Try to change
jpgeproto.Dtype = DataType.DtStringRef;
to
jpgeproto.Dtype = DataType.DtString;
You may also need to add a tensor shape with a dimension to your tensor proto. Here's my working solution in Java, should be similar in C#:
TensorShapeProto.Dim dim = TensorShapeProto.Dim.newBuilder().setSize(1).build();
TensorShapeProto shape = TensorShapeProto.newBuilder().addDim(dim).build();
TensorProto proto = TensorProto.newBuilder()
.addStringVal(ByteString.copyFrom(imageBytes))
.setTensorShape(shape)
.setDtype(DataType.DT_STRING)
.build();
ModelSpec spec = ModelSpec.newBuilder().setName("inception").build();
PredictRequest r = PredictRequest.newBuilder()
.setModelSpec(spec)
.putInputs("images", proto).build();
PredictResponse response = blockingStub.predict(r);

Create Timesheet using PSI Project Server 2013 - General Invalid Operation

I'm trying to use the TimeSheet.CreateTimesheet method from msdn but unfortunately I receive the General Invalid Operation error from my console.
I suspect it's a permissions problem, because of I have followed all of the instructions posted in the entrance from msdn linked before.
Here are the MAIN code:
// Here are the variables
SvcTimeSheet.TimesheetDataSet timesheetDs;
SvcTimeSheet.TimeSheet timeSheetSvc = new SvcTimeSheet.TimeSheet();
timeSheetSvc.UseDefaultCredentials = true;
timeSheetSvc.Url = PROJECT_SERVER_URI + TIMESHEET_SERVICE_PATH;
Guid myUid = resourceSvc.GetCurrentUserUid();
SvcAdmin.TimePeriodDataSet timeperiodDs = adminSvc.ReadPeriods(SvcAdmin.PeriodState.Open);
Guid periodUid = timeperiodDs.TimePeriods[0].WPRD_UID;
// Here are the Timesheet creation method
timesheetDs = new SvcTimeSheet.TimesheetDataSet();
SvcTimeSheet.TimesheetDataSet.HeadersRow headersRow = timesheetDs.Headers.NewHeadersRow();
headersRow.RES_UID = myUid;
headersRow.TS_UID = Guid.NewGuid();
headersRow.WPRD_UID = periodUid;
headersRow.TS_CREATOR_RES_UID = myUid;
headersRow.TS_NAME = "Timesheet ";
headersRow.TS_COMMENTS = "Random comment text here";
headersRow.TS_ENTRY_MODE_ENUM = (byte)PSLibrary.TimesheetEnum.EntryMode.Weekly;
timesheetDs.Headers.AddHeadersRow(headersRow);
// Create the timesheet with the default line types that are specified by the admin.
timeSheetSvc.CreateTimesheet(timesheetDs, SvcTimeSheet.PreloadType.Assignments);
timesheetDs = timeSheetSvc.ReadTimesheet(headersRow.TS_UID);
When timeSheetSvc.CreateTimesheet(timesheetDs, SvcTimeSheet.PreloadType.Assignments); it is called, I get the General Invalid Operation.
Anybody knows what that means? Or where can I find further information about?
EDIT:
Here are the screenshot from my PSI Console, that parses the error:
Thanks in advance,

How to update an existing exchange rate

Using the ExchangeRateServiceClient every time I try to use client.create for currency a currency code pair I get an exception
Cannot create a record in Exchange rate currency pair (ExchangeRateCurrencyPair). From currency: USD, EUR. The record already exists.
System.Exception {System.ServiceModel.FaultException}
I am brand new to the AX API...I am using C#
AXDev09.ExchangeRateServiceCreateRequest request =
new AXDev09.ExchangeRateServiceCreateRequest();
AXDev09.ExchangeRateServiceClient client = new AXDev09.ExchangeRateServiceClient();
request.CallContext = new AXDev09.CallContext();
request.CallContext.Language = "en-us";
request.CallContext.Company = "T51";
request.CallContext.MessageId = Guid.NewGuid().ToString();
AXDev09.AxdEntity_CurrencyPair[] myPair = new AXDev09.AxdEntity_CurrencyPair[1];
myPair[0] = new AXDev09.AxdEntity_CurrencyPair();
myPair[0].ToCurrencyCode = "EUR";
myPair[0].FromCurrencyCode = "USD";
AXDev09.AxdEntity_ExchangeRate[] myExchange = new AXDev09.AxdEntity_ExchangeRate[1];
myExchange[0] = new AXDev09.AxdEntity_ExchangeRate();
myExchange[0].ExchangeRate = Convert.ToDecimal("0.708");
myExchange[0].ExchangeRateSpecified = true;
myPair[0].ExchangeRate = myExchange;
myPair[0].ExchangeRateDisplayFactor = AXDev09.AxdEnum_ExchangeRateDisplayFactor.One;
myPair[0].ExchangeRateType = "Average";
AxdType_DateTime myFromDate = new AxdType_DateTime();
myFromDate.localDateTime = DateTime.Now.ToUniversalTime();
myFromDate.timezone = AxdEnum_Timezone.GMTMINUS0600CENTRALTIME;
myFromDate.Value = myFromDate.localDateTime;
AxdType_DateTime myToDate = new AxdType_DateTime();
myToDate.localDateTime = DateTime.Now.ToUniversalTime();
myToDate.timezone = AxdEnum_Timezone.GMTMINUS0600CENTRALTIME;
myToDate.Value = myToDate.localDateTime;
request.LedgerExchangeRate = new AXDev09.AxdLedgerExchangeRate();
request.LedgerExchangeRate.CurrencyPair = myPair;
request.LedgerExchangeRate.ValidFromDateTime = myFromDate;
request.LedgerExchangeRate.ValidToDateTime = myToDate;
client.Open();
client.create(request.CallContext, request.LedgerExchangeRate);
client.Close();
The ExchangeRateServiceClient does appear to be a standard API.
The standards web service is called LedgerExchangeRateService.
If you provide two currencies, then try to reverse them.
if the error message is to be believed, seems like the issue is when it tries to create the ExchangeRateCurrencyPair
there is a no-duplicates index on:
fromCurrency
toCurrency
ExchangeRateType
"I am trying to add a new currency rate...with a new set from from-to but I keep getting "The record already exists" error eventhough I'm setting new FROM-TO dates."
it seems to be objecting to ExchangeRateCurrencyPair(not to the date effective bits) maybe try selecting the pair instead of attempting to create it every time--or maybe try debugging through a successful new pair to see if a tweak may be needed in the standard service

Categories