Ejemplo n.º 1
0
        public async Task PutEtcdProviderData_Currencies_ReturnsMockCurrencies()
        {
            // Arrange
            const string key = "currencies";
            await _polly.ExecuteAsync(async() =>
            {
                await _etcdClient.DeleteAsync(key);
                var value = await _etcdClient.GetValAsync(key);

                return(string.IsNullOrEmpty(value));
            });

            await WriteToEtcdAsync("currencies.json", key);

            var currencies = await ReadCurrencyFromEtcdAsync(key);

            var dataRetriever = _serviceProvider.GetRequiredService <IDataRetriever <IEnumerable <MockCurrency> > >();
            var expectedData  = currencies.ToList();

            expectedData.First().Code = Guid.NewGuid().ToString();

            // Act
            await _etcdClient.PutAsync(key, JsonSerializer.Serialize(expectedData));

            // Arrange
            await _polly.ExecuteAsync(async() =>
            {
                var actualData = await dataRetriever.GetAsync();
                Assert.Equal(actualData.Select(l => l.Code), expectedData.Select(l => l.Code));

                return(true);
            });
        }
Ejemplo n.º 2
0
        public async Task <bool> RemoveAllMembers()
        {
            var members = await GetClusterMembers();

            if (!members.Any())
            {
                return(true);
            }
            var response = _client.PutAsync(SEEDS, "[]");

            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 创建Client节点树
        /// </summary>
        /// <returns></returns>
        private static async Task CreateClientTree()
        {
            if (m_client != null)
            {
                //移除Client所有节点
                await m_client.DeleteRangeAsync("Client/");

                await m_client.PutAsync("Client/Client0", "OffLine");

                await m_client.PutAsync("Client/Client1", "OffLine");

                await m_client.PutAsync("Client/Client2", "OffLine");
            }
        }
        public async Task WriteStateAsync(string grainType, GrainReference grainReference, IGrainState grainState)
        {
            var key = GetKeyName(grainType, grainReference);

            try {
                if (this.logger.IsEnabled(LogLevel.Trace))
                {
                    this.logger.Trace((int)MorsteadEtcdProviderErrorCode.MorsteadEtcdProvider_Storage_Writing, "Writing: GrainType={0} Grainid={1} ETag={2} to Container={3}", grainType, grainReference, grainState.ETag, name);
                }
                await etcdClient.PutAsync(key, ConvertToStorageFormat(grainState.State)).ConfigureAwait(false);

                if (this.logger.IsEnabled(LogLevel.Trace))
                {
                    this.logger.Trace((int)MorsteadEtcdProviderErrorCode.MorsteadEtcdProvider_Storage_Written, "Written: GrainType={0} Grainid={1} ETag={2} to Container={3}", grainType, grainReference, grainState.ETag, name);
                }
            }
            catch (Exception ex)
            {
                logger.Error((int)MorsteadEtcdProviderErrorCode.MorsteadEtcdProvider_WriteError,
                             string.Format("Error writing: GrainType={0} Grainid={1} ETag={2} to Container={3} Exception={4}", grainType, grainReference, grainState.ETag, name, ex.Message),
                             ex);

                throw;
            }
        }
        public async Task <Response> Set(FileConfiguration ocelotConfiguration)
        {
            var json   = JsonConvert.SerializeObject(ocelotConfiguration, Formatting.Indented);
            var result = await _etcdClient.PutAsync($"/{_configurationKey}", json);

            _cache.AddAndDelete(_configurationKey, ocelotConfiguration, TimeSpan.FromSeconds(3), _configurationKey);

            return(new OkResponse());

            // return new ErrorResponse(new UnableToSetConfigInEtcdError($"Unable to set FileConfiguration in etcd, response status code from etcd was {result.StatusCode}"));
        }
        /// <summary>
        /// 系统配置注册
        /// </summary>
        /// <param name="client">客户端</param>
        /// <param name="sysName">系统名称</param>
        /// <param name="registration">配置信息</param>
        /// <returns></returns>
        private static async Task AddConfigAsync(EtcdClient client, string sysName, AgentServiceRegistration registration)
        {
            string key      = "/" + sysName + "/config";
            string timeKey  = "/" + sysName + "/Time/" + registration.Name + "/" + registration.ID;
            var    leasersp = await client.LeaseGrantAsync(new LeaseGrantRequest()
            {
                ID = 0, TTL = 10
            });

            var lockrsp = await client.LockAsync(new V3Lockpb.LockRequest()
            {
                Lease = leasersp.ID, Name = (key + "1").ToGoogleString()
            });

            var rsp = await client.GetAsync(key);

            EtcdConfig config = new EtcdConfig();

            if (rsp.Kvs.Count == 0)
            {
                var lst = new List <AgentServiceRegistration>
                {
                    registration
                };
                config.Services = lst;
            }
            else
            {
                var val = JsonConvert.DeserializeObject <EtcdConfig>(rsp.Kvs[0].Value.FromGoogleString());
                List <AgentServiceRegistration> lst = new List <AgentServiceRegistration>(val.Services);
                lst.Add(registration);
                config.Services = lst;
            }
            string cof = JsonConvert.SerializeObject(config);
            await client.PutAsync(key, cof);

            await client.PutAsync(timeKey, DateTime.Now.ToString("yyyy-MM-dd mm:HH:ss"));

            await client.UnlockAsync(key + "1");
        }
Ejemplo n.º 7
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            IList <string> uriList     = new List <string>();
            var            controllers = Assembly.GetExecutingAssembly().GetTypes()
                                         .Where(type => typeof(ControllerBase).IsAssignableFrom(type));
            Type routeType = typeof(RouteAttribute);

            foreach (var item in controllers)
            {
                string routeName = string.Empty;
                var    route     = item.CustomAttributes.Where(type => type.AttributeType.IsAssignableFrom(routeType));
                if (route.Count() > 0)
                {
                    routeName = route?.FirstOrDefault()?.ConstructorArguments?.FirstOrDefault().Value.ToString();
                    int inde = routeName.IndexOf("[");
                    routeName = routeName.Substring(0, inde);
                }
                string contName = item.Name.Replace("Controller", string.Empty);
                uriList.Add($"{contName}#{routeName}{contName}");
            }
            string host   = "127.0.0.1";
            int    port   = 2379;
            string putKey = "/test/{0}#{1}";

            using (EtcdClient etcd = new EtcdClient(host, port))
            {
                foreach (var item in uriList)
                {
                    string[] uridata = item.Split('#');
                    etcd.PutAsync(string.Format(putKey, uridata[0], uri.Authority).ToLower(), $"{uri.ToString()}{uridata[1]}");
                }
            }
            lifetime.ApplicationStopped.Register(() =>
            {
                using (EtcdClient etcd = new EtcdClient(host, port))
                {
                    foreach (var item in uriList)
                    {
                        string[] uridata = item.Split('#');
                        etcd.DeleteAsync(string.Format(putKey, uridata[0], uri.Authority).ToLower());
                    }
                }
            });
            app.UseMvc();
        }
Ejemplo n.º 8
0
        public async Task ImHere()
        {
            var leaseGrantRequest = new LeaseGrantRequest
            {
                TTL = LeaseTtl
            };

            var leaseGrantResponse = await _client.LeaseGrantAsync(leaseGrantRequest);

            _leaseId = leaseGrantResponse.ID;
            await _client.PutAsync(new PutRequest
            {
                Lease = leaseGrantResponse.ID,
                Key   = _key,
                Value = _broker
            });

            _timer = new Timer(LeaseKeepAlive, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
        }
        public async void CanDeserializeKvsFromRange()
        {
            JsonConvert.SerializeObject(new MorsteadEtcdBasedReminderEntry()
            {
                ETag = "ETag"
            });

            var client = new EtcdClient("http://localhost:2379");
            await client.PutAsync("key/1", JsonConvert.SerializeObject(new MorsteadEtcdBasedReminderEntry()
            {
                ETag = "ETag"
            }));

            var s = await client.GetRangeValAsync("key/*");

            foreach (var i in s)
            {
            }
        }
Ejemplo n.º 10
0
 private async Task UpdateBrokerForPartition(BrokersObject brokersObject, int brokerNumber, int partitionNumber, string producerTablePrefixKey)
 {
     var key   = producerTablePrefixKey + partitionNumber;
     var value = brokersObject.Name + brokerNumber;
     await _client.PutAsync(key, value);
 }
Ejemplo n.º 11
0
        /// <inheritdoc/>
        public async Task WriteAsync(T model, params string[] keys)
        {
            var key = GetKey(keys);

            await _etcdClient.PutAsync(key, _dataSerializer.Serialize(model), _metadata);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Add/update a configuration reocrd in the repository
        /// </summary>
        /// <param name="configurationItem">The configuration record to add or update</param>
        /// <param name="force">Force a set (overwrite) even if configuraton item already exists with a different version</param>
        public virtual async Task Set(TModel configurationItem, bool force = false)
        {
            if (configurationItem == null)
            {
                throw new ArgumentNullException(nameof(configurationItem));
            }

            //Set created timestamp for version 0
            if (configurationItem.Version == 0 || force)
            {
                configurationItem.CreatedOn = DateTimeOffset.UtcNow;
            }
            //Otherwise set modified timestamp
            else
            {
                configurationItem.ModifiedOn = DateTimeOffset.UtcNow;
            }

            //Create the etcd key for the configuration item
            var etcdKey = CreateEtcdKey(configurationItem);

            //Serialise configuration item as JSON to persist to etcd
            var json = JsonConvert.SerializeObject(configurationItem, typeof(TModel), _jsonSerializerSettings);

            //Ensure the repository is initialised before retreiving item
            await _readyTask.ConfigureAwait(false);

            //If we force an update then we just put the value without a check
            if (force)
            {
                //Put the key/value into etcd
                var setReponse = await _etcdClient.PutAsync(etcdKey, json).ConfigureAwait(false);

                //Update the configuration item version
                configurationItem.Version = setReponse.Header.Revision;
            }
            //If we do not force update we need to do a CAS (check and set) which will eliminate concurrency issues and accidental overwrites
            else
            {
                //Create a transaction that checks the ModRevision is the same as the configuration item before performing the put operation
                var transReq = new TxnRequest();
                if (configurationItem.Version == 0)
                {
                    transReq.Compare.Add(new Compare
                    {
                        Key            = Google.Protobuf.ByteString.CopyFromUtf8(etcdKey),
                        Result         = Compare.Types.CompareResult.Equal,
                        CreateRevision = configurationItem.Version,
                        Target         = Compare.Types.CompareTarget.Create
                    });
                }
                else
                {
                    transReq.Compare.Add(new Compare
                    {
                        Key         = Google.Protobuf.ByteString.CopyFromUtf8(etcdKey),
                        Result      = Compare.Types.CompareResult.Equal,
                        ModRevision = configurationItem.Version,
                        Target      = Compare.Types.CompareTarget.Mod
                    });
                }
                transReq.Success.Add(new RequestOp
                {
                    RequestPut = new PutRequest
                    {
                        Key   = Google.Protobuf.ByteString.CopyFromUtf8(etcdKey),
                        Value = Google.Protobuf.ByteString.CopyFromUtf8(json)
                    }
                });
                //Execute transaction
                var transResponse = await _etcdClient.TransactionAsync(transReq);

                //Check the transaction succeeded
                if (transResponse.Succeeded)
                {
                    //Update the configuration item version
                    configurationItem.Version = transResponse.Responses[0].ResponsePut.Header.Revision;
                }
                else
                {
                    throw new ArgumentException("Unable to set configuration item, either the specified item does not exist or the version specified was incorrect.");
                }
            }
        }
        /// <summary>
        /// 注册服务
        /// </summary>
        /// <param name="client">客户端</param>
        /// <param name="systemName">系统名称(默认:Agent)</param>
        /// <param name="registration">注册信息</param>
        /// <returns></returns>
        public static async Task <bool> RegisterAsync(this EtcdClient client, AgentServiceRegistration registration, string systemName = "Agent")
        {
            try
            {
                // /系统/Services/srvname/srvid
                ServiceEntry entry = new ServiceEntry()
                {
                    Host    = registration.Address,
                    Port    = registration.Port,
                    Name    = registration.Name,
                    Id      = registration.ID,
                    Tags    = registration.Tags,
                    Version = registration.Version
                };
                if (registration.Checks == null || registration.Checks.Length == 0)
                {
                    registration.Checks             = new AgentServiceCheck[1];
                    registration.Checks[0]          = new AgentServiceCheck();
                    registration.Checks[0].Interval = new TimeSpan(0, 0, 5);
                }
                var               val   = JsonConvert.SerializeObject(entry);
                string            key   = "/" + systemName + "/Services/" + entry.Name + "/" + entry.Id;
                CancellationToken token = new CancellationToken();

                if (!string.IsNullOrEmpty(Utiletcd.Sinlgeton.Password) || !string.IsNullOrEmpty(Utiletcd.Sinlgeton.Username))
                {
                    await client.AuthenticateAsync(new AuthenticateRequest()
                    {
                        Name     = Utiletcd.Sinlgeton.Username,
                        Password = Utiletcd.Sinlgeton.Password
                    });
                }

                //申请TTL的ID
                var lease = await client.LeaseGrantAsync(new LeaseGrantRequest()
                {
                    ID = 0, TTL = (long)registration.Checks[0].Interval.TotalSeconds
                });

                //加入节点
                var rsp = await client.PutAsync(new PutRequest()
                {
                    Key = key.ToGoogleString(), Value = val.ToGoogleString(), Lease = lease.ID
                });

                //保持激活
                await client.LeaseKeepAlive(new LeaseKeepAliveRequest()
                {
                    ID = lease.ID
                }, Watch, token);

                //添加配置
                await AddConfigAsync(client, systemName, registration);

                //服务加入更新列表
                await Utiletcd.Sinlgeton.AddKeepAliveAsync(client, key, (long)registration.Checks[0].Interval.TotalSeconds, lease.ID);

                Init(client, key);
                return(true);
            }catch (Exception ex)
            {
                return(false);
            }
        }
Ejemplo n.º 14
0
 public async Task PutAsync(string key, string value)
 {
     await _etcdClient.PutAsync(key, value);
 }